lhl 2 anos atrás
pai
commit
4b44e80e6b
100 arquivos alterados com 15206 adições e 0 exclusões
  1. 15 0
      node_modules/.bin/acorn
  2. 17 0
      node_modules/.bin/acorn.cmd
  3. 18 0
      node_modules/.bin/acorn.ps1
  4. 15 0
      node_modules/.bin/escodegen
  5. 17 0
      node_modules/.bin/escodegen.cmd
  6. 18 0
      node_modules/.bin/escodegen.ps1
  7. 15 0
      node_modules/.bin/esgenerate
  8. 17 0
      node_modules/.bin/esgenerate.cmd
  9. 18 0
      node_modules/.bin/esgenerate.ps1
  10. 15 0
      node_modules/.bin/esparse
  11. 17 0
      node_modules/.bin/esparse.cmd
  12. 18 0
      node_modules/.bin/esparse.ps1
  13. 15 0
      node_modules/.bin/esvalidate
  14. 17 0
      node_modules/.bin/esvalidate.cmd
  15. 18 0
      node_modules/.bin/esvalidate.ps1
  16. 15 0
      node_modules/.bin/mime
  17. 17 0
      node_modules/.bin/mime.cmd
  18. 18 0
      node_modules/.bin/mime.ps1
  19. 15 0
      node_modules/.bin/mkdirp
  20. 17 0
      node_modules/.bin/mkdirp.cmd
  21. 18 0
      node_modules/.bin/mkdirp.ps1
  22. 15 0
      node_modules/.bin/os-name
  23. 17 0
      node_modules/.bin/os-name.cmd
  24. 18 0
      node_modules/.bin/os-name.ps1
  25. 15 0
      node_modules/.bin/osx-release
  26. 17 0
      node_modules/.bin/osx-release.cmd
  27. 18 0
      node_modules/.bin/osx-release.ps1
  28. 15 0
      node_modules/.bin/rimraf
  29. 17 0
      node_modules/.bin/rimraf.cmd
  30. 18 0
      node_modules/.bin/rimraf.ps1
  31. 15 0
      node_modules/.bin/semver
  32. 17 0
      node_modules/.bin/semver.cmd
  33. 18 0
      node_modules/.bin/semver.ps1
  34. 15 0
      node_modules/.bin/vm2
  35. 17 0
      node_modules/.bin/vm2.cmd
  36. 18 0
      node_modules/.bin/vm2.ps1
  37. 14 0
      node_modules/@tootallnate/once/dist/index.d.ts
  38. 39 0
      node_modules/@tootallnate/once/dist/index.js
  39. 1 0
      node_modules/@tootallnate/once/dist/index.js.map
  40. 78 0
      node_modules/@tootallnate/once/package.json
  41. 167 0
      node_modules/acorn-walk/CHANGELOG.md
  42. 21 0
      node_modules/acorn-walk/LICENSE
  43. 126 0
      node_modules/acorn-walk/README.md
  44. 114 0
      node_modules/acorn-walk/dist/walk.d.ts
  45. 463 0
      node_modules/acorn-walk/dist/walk.js
  46. 443 0
      node_modules/acorn-walk/dist/walk.mjs
  47. 75 0
      node_modules/acorn-walk/package.json
  48. 810 0
      node_modules/acorn/CHANGELOG.md
  49. 21 0
      node_modules/acorn/LICENSE
  50. 273 0
      node_modules/acorn/README.md
  51. 4 0
      node_modules/acorn/bin/acorn
  52. 252 0
      node_modules/acorn/dist/acorn.d.ts
  53. 13 0
      node_modules/acorn/dist/acorn.js
  54. 7 0
      node_modules/acorn/dist/acorn.mjs
  55. 2 0
      node_modules/acorn/dist/acorn.mjs.d.ts
  56. 91 0
      node_modules/acorn/dist/bin.js
  57. 78 0
      node_modules/acorn/package.json
  58. 74 0
      node_modules/address/History.md
  59. 22 0
      node_modules/address/LICENSE.txt
  60. 93 0
      node_modules/address/README.md
  61. 28 0
      node_modules/address/lib/address.d.ts
  62. 263 0
      node_modules/address/lib/address.js
  63. 78 0
      node_modules/address/package.json
  64. 145 0
      node_modules/agent-base/README.md
  65. 78 0
      node_modules/agent-base/dist/src/index.d.ts
  66. 203 0
      node_modules/agent-base/dist/src/index.js
  67. 0 0
      node_modules/agent-base/dist/src/index.js.map
  68. 4 0
      node_modules/agent-base/dist/src/promisify.d.ts
  69. 18 0
      node_modules/agent-base/dist/src/promisify.js
  70. 1 0
      node_modules/agent-base/dist/src/promisify.js.map
  71. 20 0
      node_modules/agent-base/node_modules/debug/LICENSE
  72. 481 0
      node_modules/agent-base/node_modules/debug/README.md
  73. 101 0
      node_modules/agent-base/node_modules/debug/package.json
  74. 269 0
      node_modules/agent-base/node_modules/debug/src/browser.js
  75. 274 0
      node_modules/agent-base/node_modules/debug/src/common.js
  76. 10 0
      node_modules/agent-base/node_modules/debug/src/index.js
  77. 263 0
      node_modules/agent-base/node_modules/debug/src/node.js
  78. 162 0
      node_modules/agent-base/node_modules/ms/index.js
  79. 21 0
      node_modules/agent-base/node_modules/ms/license.md
  80. 69 0
      node_modules/agent-base/node_modules/ms/package.json
  81. 60 0
      node_modules/agent-base/node_modules/ms/readme.md
  82. 98 0
      node_modules/agent-base/package.json
  83. 345 0
      node_modules/agent-base/src/index.ts
  84. 33 0
      node_modules/agent-base/src/promisify.ts
  85. 170 0
      node_modules/agentkeepalive/History.md
  86. 248 0
      node_modules/agentkeepalive/README.md
  87. 5 0
      node_modules/agentkeepalive/browser.js
  88. 43 0
      node_modules/agentkeepalive/index.d.ts
  89. 4 0
      node_modules/agentkeepalive/index.js
  90. 416 0
      node_modules/agentkeepalive/lib/_http_agent.js
  91. 133 0
      node_modules/agentkeepalive/lib/agent.js
  92. 42 0
      node_modules/agentkeepalive/lib/https_agent.js
  93. 83 0
      node_modules/agentkeepalive/package.json
  94. 21 0
      node_modules/ali-oss/LICENSE
  95. 4449 0
      node_modules/ali-oss/README.md
  96. 1978 0
      node_modules/ali-oss/dist/aliyun-oss-sdk.js
  97. 3 0
      node_modules/ali-oss/dist/aliyun-oss-sdk.min.js
  98. 6 0
      node_modules/ali-oss/lib/browser.js
  99. 297 0
      node_modules/ali-oss/lib/browser/bucket.js
  100. 403 0
      node_modules/ali-oss/lib/browser/client.js

+ 15 - 0
node_modules/.bin/acorn

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../acorn/bin/acorn" "$@"
+  ret=$?
+else 
+  node  "$basedir/../acorn/bin/acorn" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/acorn.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\acorn\bin\acorn" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/acorn.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../acorn/bin/acorn" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../acorn/bin/acorn" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/escodegen

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../escodegen/bin/escodegen.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../escodegen/bin/escodegen.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/escodegen.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\escodegen\bin\escodegen.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/escodegen.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../escodegen/bin/escodegen.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../escodegen/bin/escodegen.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/esgenerate

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../escodegen/bin/esgenerate.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../escodegen/bin/esgenerate.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/esgenerate.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\escodegen\bin\esgenerate.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/esgenerate.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../escodegen/bin/esgenerate.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../escodegen/bin/esgenerate.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/esparse

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../esprima/bin/esparse.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../esprima/bin/esparse.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/esparse.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\esprima\bin\esparse.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/esparse.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../esprima/bin/esparse.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../esprima/bin/esparse.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/esvalidate

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../esprima/bin/esvalidate.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../esprima/bin/esvalidate.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/esvalidate.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\esprima\bin\esvalidate.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/esvalidate.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../esprima/bin/esvalidate.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../esprima/bin/esvalidate.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/mime

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../mime/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../mime/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/mime.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\mime\cli.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/mime.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../mime/cli.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../mime/cli.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/mkdirp

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../mkdirp/bin/cmd.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../mkdirp/bin/cmd.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/mkdirp.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\mkdirp\bin\cmd.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/mkdirp.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../mkdirp/bin/cmd.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../mkdirp/bin/cmd.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/os-name

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../os-name/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../os-name/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/os-name.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\os-name\cli.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/os-name.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../os-name/cli.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../os-name/cli.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/osx-release

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../osx-release/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../osx-release/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/osx-release.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\osx-release\cli.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/osx-release.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../osx-release/cli.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../osx-release/cli.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/rimraf

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../rimraf/bin.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../rimraf/bin.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/rimraf.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\rimraf\bin.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/rimraf.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../rimraf/bin.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../rimraf/bin.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/semver

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../semver/bin/semver" "$@"
+  ret=$?
+else 
+  node  "$basedir/../semver/bin/semver" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/semver.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\semver\bin\semver" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/semver.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../semver/bin/semver" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../semver/bin/semver" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 15 - 0
node_modules/.bin/vm2

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../vm2/bin/vm2" "$@"
+  ret=$?
+else 
+  node  "$basedir/../vm2/bin/vm2" "$@"
+  ret=$?
+fi
+exit $ret

+ 17 - 0
node_modules/.bin/vm2.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\vm2\bin\vm2" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b

+ 18 - 0
node_modules/.bin/vm2.ps1

@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../vm2/bin/vm2" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../vm2/bin/vm2" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 14 - 0
node_modules/@tootallnate/once/dist/index.d.ts

@@ -0,0 +1,14 @@
+/// <reference types="node" />
+import { EventEmitter } from 'events';
+declare function once<T>(emitter: EventEmitter, name: string): once.CancelablePromise<T>;
+declare namespace once {
+    interface CancelFunction {
+        (): void;
+    }
+    interface CancelablePromise<T> extends Promise<T> {
+        cancel: CancelFunction;
+    }
+    type CancellablePromise<T> = CancelablePromise<T>;
+    function spread<T extends any[]>(emitter: EventEmitter, name: string): once.CancelablePromise<T>;
+}
+export = once;

+ 39 - 0
node_modules/@tootallnate/once/dist/index.js

@@ -0,0 +1,39 @@
+"use strict";
+function noop() { }
+function once(emitter, name) {
+    const o = once.spread(emitter, name);
+    const r = o.then((args) => args[0]);
+    r.cancel = o.cancel;
+    return r;
+}
+(function (once) {
+    function spread(emitter, name) {
+        let c = null;
+        const p = new Promise((resolve, reject) => {
+            function cancel() {
+                emitter.removeListener(name, onEvent);
+                emitter.removeListener('error', onError);
+                p.cancel = noop;
+            }
+            function onEvent(...args) {
+                cancel();
+                resolve(args);
+            }
+            function onError(err) {
+                cancel();
+                reject(err);
+            }
+            c = cancel;
+            emitter.on(name, onEvent);
+            emitter.on('error', onError);
+        });
+        if (!c) {
+            throw new TypeError('Could not get `cancel()` function');
+        }
+        p.cancel = c;
+        return p;
+    }
+    once.spread = spread;
+})(once || (once = {}));
+module.exports = once;
+//# sourceMappingURL=index.js.map

+ 1 - 0
node_modules/@tootallnate/once/dist/index.js.map

@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,SAAS,IAAI,KAAI,CAAC;AAElB,SAAS,IAAI,CACZ,OAAqB,EACrB,IAAY;IAEZ,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAM,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAA8B,CAAC;IACtE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACpB,OAAO,CAAC,CAAC;AACV,CAAC;AAED,WAAU,IAAI;IAWb,SAAgB,MAAM,CACrB,OAAqB,EACrB,IAAY;QAEZ,IAAI,CAAC,GAA+B,IAAI,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5C,SAAS,MAAM;gBACd,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACtC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACzC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;YACjB,CAAC;YACD,SAAS,OAAO,CAAC,GAAG,IAAW;gBAC9B,MAAM,EAAE,CAAC;gBACT,OAAO,CAAC,IAAS,CAAC,CAAC;YACpB,CAAC;YACD,SAAS,OAAO,CAAC,GAAU;gBAC1B,MAAM,EAAE,CAAC;gBACT,MAAM,CAAC,GAAG,CAAC,CAAC;YACb,CAAC;YACD,CAAC,GAAG,MAAM,CAAC;YACX,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC,CAA8B,CAAC;QAChC,IAAI,CAAC,CAAC,EAAE;YACP,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;SACzD;QACD,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACb,OAAO,CAAC,CAAC;IACV,CAAC;IA5Be,WAAM,SA4BrB,CAAA;AACF,CAAC,EAxCS,IAAI,KAAJ,IAAI,QAwCb;AAED,iBAAS,IAAI,CAAC"}

+ 78 - 0
node_modules/@tootallnate/once/package.json

@@ -0,0 +1,78 @@
+{
+  "_from": "@tootallnate/once@1",
+  "_id": "@tootallnate/once@1.1.2",
+  "_inBundle": false,
+  "_integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+  "_location": "/@tootallnate/once",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@tootallnate/once@1",
+    "name": "@tootallnate/once",
+    "escapedName": "@tootallnate%2fonce",
+    "scope": "@tootallnate",
+    "rawSpec": "1",
+    "saveSpec": null,
+    "fetchSpec": "1"
+  },
+  "_requiredBy": [
+    "/get-uri",
+    "/http-proxy-agent",
+    "/pac-proxy-agent"
+  ],
+  "_resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+  "_shasum": "ccb91445360179a04e7fe6aff78c00ffc1eeaf82",
+  "_spec": "@tootallnate/once@1",
+  "_where": "D:\\2022\\3\\Mazui\\node_modules\\http-proxy-agent",
+  "author": {
+    "name": "Nathan Rajlich",
+    "email": "nathan@tootallnate.net",
+    "url": "http://n8.io/"
+  },
+  "bugs": {
+    "url": "https://github.com/TooTallNate/once/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Creates a Promise that waits for a single event",
+  "devDependencies": {
+    "@types/node": "^12.12.11",
+    "@typescript-eslint/eslint-plugin": "1.6.0",
+    "@typescript-eslint/parser": "1.1.0",
+    "eslint": "5.16.0",
+    "eslint-config-airbnb": "17.1.0",
+    "eslint-config-prettier": "4.1.0",
+    "eslint-import-resolver-typescript": "1.1.1",
+    "eslint-plugin-import": "2.16.0",
+    "eslint-plugin-jsx-a11y": "6.2.1",
+    "eslint-plugin-react": "7.12.4",
+    "mocha": "^6.2.2",
+    "rimraf": "^3.0.0",
+    "typescript": "^3.7.3"
+  },
+  "engines": {
+    "node": ">= 6"
+  },
+  "files": [
+    "dist"
+  ],
+  "homepage": "https://github.com/TooTallNate/once#readme",
+  "keywords": [],
+  "license": "MIT",
+  "main": "./dist/index.js",
+  "name": "@tootallnate/once",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/TooTallNate/once.git"
+  },
+  "scripts": {
+    "build": "tsc",
+    "prebuild": "rimraf dist",
+    "prepublishOnly": "npm run build",
+    "test": "mocha --reporter spec",
+    "test-lint": "eslint src --ext .js,.ts"
+  },
+  "types": "./dist/index.d.ts",
+  "version": "1.1.2"
+}

+ 167 - 0
node_modules/acorn-walk/CHANGELOG.md

@@ -0,0 +1,167 @@
+## 8.2.0 (2021-09-06)
+
+### New features
+
+Add support for walking ES2022 class static blocks.
+
+## 8.1.1 (2021-06-29)
+
+### Bug fixes
+
+Include `base` in the type declarations.
+
+## 8.1.0 (2021-04-24)
+
+### New features
+
+Support node types for class fields and private methods.
+
+## 8.0.2 (2021-01-25)
+
+### Bug fixes
+
+Adjust package.json to work with Node 12.16.0 and 13.0-13.6.
+
+## 8.0.0 (2021-01-05)
+
+### Bug fixes
+
+Fix a bug where `full` and `fullAncestor` would skip nodes with overridden types.
+
+## 8.0.0 (2020-08-12)
+
+### New features
+
+The package can now be loaded directly as an ECMAScript module in node 13+.
+
+## 7.2.0 (2020-06-17)
+
+### New features
+
+Support optional chaining and nullish coalescing.
+
+Support `import.meta`.
+
+Add support for `export * as ns from "source"`.
+
+## 7.1.1 (2020-02-13)
+
+### Bug fixes
+
+Clean up the type definitions to actually work well with the main parser.
+
+## 7.1.0 (2020-02-11)
+
+### New features
+
+Add a TypeScript definition file for the library.
+
+## 7.0.0 (2017-08-12)
+
+### New features
+
+Support walking `ImportExpression` nodes.
+
+## 6.2.0 (2017-07-04)
+
+### New features
+
+Add support for `Import` nodes.
+
+## 6.1.0 (2018-09-28)
+
+### New features
+
+The walker now walks `TemplateElement` nodes.
+
+## 6.0.1 (2018-09-14)
+
+### Bug fixes
+
+Fix bad "main" field in package.json.
+
+## 6.0.0 (2018-09-14)
+
+### Breaking changes
+
+This is now a separate package, `acorn-walk`, rather than part of the main `acorn` package.
+
+The `ScopeBody` and `ScopeExpression` meta-node-types are no longer supported.
+
+## 5.7.1 (2018-06-15)
+
+### Bug fixes
+
+Make sure the walker and bin files are rebuilt on release (the previous release didn't get the up-to-date versions).
+
+## 5.7.0 (2018-06-15)
+
+### Bug fixes
+
+Fix crash in walker when walking a binding-less catch node.
+
+## 5.6.2 (2018-06-05)
+
+### Bug fixes
+
+In the walker, go back to allowing the `baseVisitor` argument to be null to default to the default base everywhere.
+
+## 5.6.1 (2018-06-01)
+
+### Bug fixes
+
+Fix regression when passing `null` as fourth argument to `walk.recursive`.
+
+## 5.6.0 (2018-05-31)
+
+### Bug fixes
+
+Fix a bug in the walker that caused a crash when walking an object pattern spread.
+
+## 5.5.1 (2018-03-06)
+
+### Bug fixes
+
+Fix regression in walker causing property values in object patterns to be walked as expressions.
+
+## 5.5.0 (2018-02-27)
+
+### Bug fixes
+
+Support object spread in the AST walker.
+
+## 5.4.1 (2018-02-02)
+
+### Bug fixes
+
+5.4.0 somehow accidentally included an old version of walk.js.
+
+## 5.2.0 (2017-10-30)
+
+### Bug fixes
+
+The `full` and `fullAncestor` walkers no longer visit nodes multiple times.
+
+## 5.1.0 (2017-07-05)
+
+### New features
+
+New walker functions `full` and `fullAncestor`.
+
+## 3.2.0 (2016-06-07)
+
+### New features
+
+Make it possible to use `visit.ancestor` with a walk state.
+
+## 3.1.0 (2016-04-18)
+
+### New features
+
+The walker now allows defining handlers for `CatchClause` nodes.
+
+## 2.5.2 (2015-10-27)
+
+### Fixes
+
+Fix bug where the walker walked an exported `let` statement as an expression.

+ 21 - 0
node_modules/acorn-walk/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (C) 2012-2020 by various contributors (see AUTHORS)
+
+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, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 126 - 0
node_modules/acorn-walk/README.md

@@ -0,0 +1,126 @@
+# Acorn AST walker
+
+An abstract syntax tree walker for the
+[ESTree](https://github.com/estree/estree) format.
+
+## Community
+
+Acorn is open source software released under an
+[MIT license](https://github.com/acornjs/acorn/blob/master/acorn-walk/LICENSE).
+
+You are welcome to
+[report bugs](https://github.com/acornjs/acorn/issues) or create pull
+requests on [github](https://github.com/acornjs/acorn). For questions
+and discussion, please use the
+[Tern discussion forum](https://discuss.ternjs.net).
+
+## Installation
+
+The easiest way to install acorn is from [`npm`](https://www.npmjs.com/):
+
+```sh
+npm install acorn-walk
+```
+
+Alternately, you can download the source and build acorn yourself:
+
+```sh
+git clone https://github.com/acornjs/acorn.git
+cd acorn
+npm install
+```
+
+## Interface
+
+An algorithm for recursing through a syntax tree is stored as an
+object, with a property for each tree node type holding a function
+that will recurse through such a node. There are several ways to run
+such a walker.
+
+**simple**`(node, visitors, base, state)` does a 'simple' walk over a
+tree. `node` should be the AST node to walk, and `visitors` an object
+with properties whose names correspond to node types in the [ESTree
+spec](https://github.com/estree/estree). The properties should contain
+functions that will be called with the node object and, if applicable
+the state at that point. The last two arguments are optional. `base`
+is a walker algorithm, and `state` is a start state. The default
+walker will simply visit all statements and expressions and not
+produce a meaningful state. (An example of a use of state is to track
+scope at each point in the tree.)
+
+```js
+const acorn = require("acorn")
+const walk = require("acorn-walk")
+
+walk.simple(acorn.parse("let x = 10"), {
+  Literal(node) {
+    console.log(`Found a literal: ${node.value}`)
+  }
+})
+```
+
+**ancestor**`(node, visitors, base, state)` does a 'simple' walk over
+a tree, building up an array of ancestor nodes (including the current node)
+and passing the array to the callbacks as a third parameter.
+
+```js
+const acorn = require("acorn")
+const walk = require("acorn-walk")
+
+walk.ancestor(acorn.parse("foo('hi')"), {
+  Literal(_, ancestors) {
+    console.log("This literal's ancestors are:", ancestors.map(n => n.type))
+  }
+})
+```
+
+**recursive**`(node, state, functions, base)` does a 'recursive'
+walk, where the walker functions are responsible for continuing the
+walk on the child nodes of their target node. `state` is the start
+state, and `functions` should contain an object that maps node types
+to walker functions. Such functions are called with `(node, state, c)`
+arguments, and can cause the walk to continue on a sub-node by calling
+the `c` argument on it with `(node, state)` arguments. The optional
+`base` argument provides the fallback walker functions for node types
+that aren't handled in the `functions` object. If not given, the
+default walkers will be used.
+
+**make**`(functions, base)` builds a new walker object by using the
+walker functions in `functions` and filling in the missing ones by
+taking defaults from `base`.
+
+**full**`(node, callback, base, state)` does a 'full' walk over a
+tree, calling the callback with the arguments (node, state, type) for
+each node
+
+**fullAncestor**`(node, callback, base, state)` does a 'full' walk
+over a tree, building up an array of ancestor nodes (including the
+current node) and passing the array to the callbacks as a third
+parameter.
+
+```js
+const acorn = require("acorn")
+const walk = require("acorn-walk")
+
+walk.full(acorn.parse("1 + 1"), node => {
+  console.log(`There's a ${node.type} node at ${node.ch}`)
+})
+```
+
+**findNodeAt**`(node, start, end, test, base, state)` tries to locate
+a node in a tree at the given start and/or end offsets, which
+satisfies the predicate `test`. `start` and `end` can be either `null`
+(as wildcard) or a number. `test` may be a string (indicating a node
+type) or a function that takes `(nodeType, node)` arguments and
+returns a boolean indicating whether this node is interesting. `base`
+and `state` are optional, and can be used to specify a custom walker.
+Nodes are tested from inner to outer, so if two nodes match the
+boundaries, the inner one will be preferred.
+
+**findNodeAround**`(node, pos, test, base, state)` is a lot like
+`findNodeAt`, but will match any node that exists 'around' (spanning)
+the given position.
+
+**findNodeAfter**`(node, pos, test, base, state)` is similar to
+`findNodeAround`, but will match all nodes *after* the given position
+(testing outer nodes before inner nodes).

+ 114 - 0
node_modules/acorn-walk/dist/walk.d.ts

@@ -0,0 +1,114 @@
+import {Node} from 'acorn';
+
+declare module "acorn-walk" {
+  type FullWalkerCallback<TState> = (
+    node: Node,
+    state: TState,
+    type: string
+  ) => void;
+
+  type FullAncestorWalkerCallback<TState> = (
+    node: Node,
+    state: TState | Node[],
+    ancestors: Node[],
+    type: string
+  ) => void;
+  type WalkerCallback<TState> = (node: Node, state: TState) => void;
+
+  type SimpleWalkerFn<TState> = (
+    node: Node,
+    state: TState
+  ) => void;
+  
+  type AncestorWalkerFn<TState> = (
+    node: Node,
+    state: TState| Node[],
+    ancestors: Node[]
+  ) => void;
+
+  type RecursiveWalkerFn<TState> = (
+    node: Node,
+    state: TState,
+    callback: WalkerCallback<TState>
+  ) => void;
+  
+  type SimpleVisitors<TState> = {
+    [type: string]: SimpleWalkerFn<TState>
+  };
+
+  type AncestorVisitors<TState> = {
+    [type: string]: AncestorWalkerFn<TState>
+  };
+  
+  type RecursiveVisitors<TState> = {
+    [type: string]: RecursiveWalkerFn<TState>
+  };
+
+  type FindPredicate = (type: string, node: Node) => boolean;
+
+  interface Found<TState> {
+    node: Node,
+    state: TState
+  }
+
+  export function simple<TState>(
+    node: Node,
+    visitors: SimpleVisitors<TState>,
+    base?: RecursiveVisitors<TState>,
+    state?: TState
+  ): void;
+
+  export function ancestor<TState>(
+    node: Node,
+    visitors: AncestorVisitors<TState>,
+    base?: RecursiveVisitors<TState>,
+    state?: TState
+  ): void;
+
+  export function recursive<TState>(
+    node: Node,
+    state: TState,
+    functions: RecursiveVisitors<TState>,
+    base?: RecursiveVisitors<TState>
+  ): void;
+
+  export function full<TState>(
+    node: Node,
+    callback: FullWalkerCallback<TState>,
+    base?: RecursiveVisitors<TState>,
+    state?: TState
+  ): void;
+
+  export function fullAncestor<TState>(
+    node: Node,
+    callback: FullAncestorWalkerCallback<TState>,
+    base?: RecursiveVisitors<TState>,
+    state?: TState
+  ): void;
+
+  export function make<TState>(
+    functions: RecursiveVisitors<TState>,
+    base?: RecursiveVisitors<TState>
+  ): RecursiveVisitors<TState>;
+
+  export function findNodeAt<TState>(
+    node: Node,
+    start: number | undefined,
+    end?: number | undefined,
+    type?: FindPredicate | string,
+    base?: RecursiveVisitors<TState>,
+    state?: TState
+  ): Found<TState> | undefined;
+
+  export function findNodeAround<TState>(
+    node: Node,
+    start: number | undefined,
+    type?: FindPredicate | string,
+    base?: RecursiveVisitors<TState>,
+    state?: TState
+  ): Found<TState> | undefined;
+
+  export const findNodeAfter: typeof findNodeAround;
+
+  export const base: RecursiveVisitors<any>;
+}

+ 463 - 0
node_modules/acorn-walk/dist/walk.js

@@ -0,0 +1,463 @@
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+  typeof define === 'function' && define.amd ? define(['exports'], factory) :
+  (global = global || self, factory((global.acorn = global.acorn || {}, global.acorn.walk = {})));
+}(this, (function (exports) { 'use strict';
+
+  // AST walker module for Mozilla Parser API compatible trees
+
+  // A simple walk is one where you simply specify callbacks to be
+  // called on specific nodes. The last two arguments are optional. A
+  // simple use would be
+  //
+  //     walk.simple(myTree, {
+  //         Expression: function(node) { ... }
+  //     });
+  //
+  // to do something with all expressions. All Parser API node types
+  // can be used to identify node types, as well as Expression and
+  // Statement, which denote categories of nodes.
+  //
+  // The base argument can be used to pass a custom (recursive)
+  // walker, and state can be used to give this walked an initial
+  // state.
+
+  function simple(node, visitors, baseVisitor, state, override) {
+    if (!baseVisitor) { baseVisitor = base
+    ; }(function c(node, st, override) {
+      var type = override || node.type, found = visitors[type];
+      baseVisitor[type](node, st, c);
+      if (found) { found(node, st); }
+    })(node, state, override);
+  }
+
+  // An ancestor walk keeps an array of ancestor nodes (including the
+  // current node) and passes them to the callback as third parameter
+  // (and also as state parameter when no other state is present).
+  function ancestor(node, visitors, baseVisitor, state, override) {
+    var ancestors = [];
+    if (!baseVisitor) { baseVisitor = base
+    ; }(function c(node, st, override) {
+      var type = override || node.type, found = visitors[type];
+      var isNew = node !== ancestors[ancestors.length - 1];
+      if (isNew) { ancestors.push(node); }
+      baseVisitor[type](node, st, c);
+      if (found) { found(node, st || ancestors, ancestors); }
+      if (isNew) { ancestors.pop(); }
+    })(node, state, override);
+  }
+
+  // A recursive walk is one where your functions override the default
+  // walkers. They can modify and replace the state parameter that's
+  // threaded through the walk, and can opt how and whether to walk
+  // their child nodes (by calling their third argument on these
+  // nodes).
+  function recursive(node, state, funcs, baseVisitor, override) {
+    var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor
+    ;(function c(node, st, override) {
+      visitor[override || node.type](node, st, c);
+    })(node, state, override);
+  }
+
+  function makeTest(test) {
+    if (typeof test === "string")
+      { return function (type) { return type === test; } }
+    else if (!test)
+      { return function () { return true; } }
+    else
+      { return test }
+  }
+
+  var Found = function Found(node, state) { this.node = node; this.state = state; };
+
+  // A full walk triggers the callback on each node
+  function full(node, callback, baseVisitor, state, override) {
+    if (!baseVisitor) { baseVisitor = base; }
+    var last
+    ;(function c(node, st, override) {
+      var type = override || node.type;
+      baseVisitor[type](node, st, c);
+      if (last !== node) {
+        callback(node, st, type);
+        last = node;
+      }
+    })(node, state, override);
+  }
+
+  // An fullAncestor walk is like an ancestor walk, but triggers
+  // the callback on each node
+  function fullAncestor(node, callback, baseVisitor, state) {
+    if (!baseVisitor) { baseVisitor = base; }
+    var ancestors = [], last
+    ;(function c(node, st, override) {
+      var type = override || node.type;
+      var isNew = node !== ancestors[ancestors.length - 1];
+      if (isNew) { ancestors.push(node); }
+      baseVisitor[type](node, st, c);
+      if (last !== node) {
+        callback(node, st || ancestors, ancestors, type);
+        last = node;
+      }
+      if (isNew) { ancestors.pop(); }
+    })(node, state);
+  }
+
+  // Find a node with a given start, end, and type (all are optional,
+  // null can be used as wildcard). Returns a {node, state} object, or
+  // undefined when it doesn't find a matching node.
+  function findNodeAt(node, start, end, test, baseVisitor, state) {
+    if (!baseVisitor) { baseVisitor = base; }
+    test = makeTest(test);
+    try {
+      (function c(node, st, override) {
+        var type = override || node.type;
+        if ((start == null || node.start <= start) &&
+            (end == null || node.end >= end))
+          { baseVisitor[type](node, st, c); }
+        if ((start == null || node.start === start) &&
+            (end == null || node.end === end) &&
+            test(type, node))
+          { throw new Found(node, st) }
+      })(node, state);
+    } catch (e) {
+      if (e instanceof Found) { return e }
+      throw e
+    }
+  }
+
+  // Find the innermost node of a given type that contains the given
+  // position. Interface similar to findNodeAt.
+  function findNodeAround(node, pos, test, baseVisitor, state) {
+    test = makeTest(test);
+    if (!baseVisitor) { baseVisitor = base; }
+    try {
+      (function c(node, st, override) {
+        var type = override || node.type;
+        if (node.start > pos || node.end < pos) { return }
+        baseVisitor[type](node, st, c);
+        if (test(type, node)) { throw new Found(node, st) }
+      })(node, state);
+    } catch (e) {
+      if (e instanceof Found) { return e }
+      throw e
+    }
+  }
+
+  // Find the outermost matching node after a given position.
+  function findNodeAfter(node, pos, test, baseVisitor, state) {
+    test = makeTest(test);
+    if (!baseVisitor) { baseVisitor = base; }
+    try {
+      (function c(node, st, override) {
+        if (node.end < pos) { return }
+        var type = override || node.type;
+        if (node.start >= pos && test(type, node)) { throw new Found(node, st) }
+        baseVisitor[type](node, st, c);
+      })(node, state);
+    } catch (e) {
+      if (e instanceof Found) { return e }
+      throw e
+    }
+  }
+
+  // Find the outermost matching node before a given position.
+  function findNodeBefore(node, pos, test, baseVisitor, state) {
+    test = makeTest(test);
+    if (!baseVisitor) { baseVisitor = base; }
+    var max
+    ;(function c(node, st, override) {
+      if (node.start > pos) { return }
+      var type = override || node.type;
+      if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node))
+        { max = new Found(node, st); }
+      baseVisitor[type](node, st, c);
+    })(node, state);
+    return max
+  }
+
+  // Used to create a custom walker. Will fill in all missing node
+  // type properties with the defaults.
+  function make(funcs, baseVisitor) {
+    var visitor = Object.create(baseVisitor || base);
+    for (var type in funcs) { visitor[type] = funcs[type]; }
+    return visitor
+  }
+
+  function skipThrough(node, st, c) { c(node, st); }
+  function ignore(_node, _st, _c) {}
+
+  // Node walkers.
+
+  var base = {};
+
+  base.Program = base.BlockStatement = base.StaticBlock = function (node, st, c) {
+    for (var i = 0, list = node.body; i < list.length; i += 1)
+      {
+      var stmt = list[i];
+
+      c(stmt, st, "Statement");
+    }
+  };
+  base.Statement = skipThrough;
+  base.EmptyStatement = ignore;
+  base.ExpressionStatement = base.ParenthesizedExpression = base.ChainExpression =
+    function (node, st, c) { return c(node.expression, st, "Expression"); };
+  base.IfStatement = function (node, st, c) {
+    c(node.test, st, "Expression");
+    c(node.consequent, st, "Statement");
+    if (node.alternate) { c(node.alternate, st, "Statement"); }
+  };
+  base.LabeledStatement = function (node, st, c) { return c(node.body, st, "Statement"); };
+  base.BreakStatement = base.ContinueStatement = ignore;
+  base.WithStatement = function (node, st, c) {
+    c(node.object, st, "Expression");
+    c(node.body, st, "Statement");
+  };
+  base.SwitchStatement = function (node, st, c) {
+    c(node.discriminant, st, "Expression");
+    for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) {
+      var cs = list$1[i$1];
+
+      if (cs.test) { c(cs.test, st, "Expression"); }
+      for (var i = 0, list = cs.consequent; i < list.length; i += 1)
+        {
+        var cons = list[i];
+
+        c(cons, st, "Statement");
+      }
+    }
+  };
+  base.SwitchCase = function (node, st, c) {
+    if (node.test) { c(node.test, st, "Expression"); }
+    for (var i = 0, list = node.consequent; i < list.length; i += 1)
+      {
+      var cons = list[i];
+
+      c(cons, st, "Statement");
+    }
+  };
+  base.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) {
+    if (node.argument) { c(node.argument, st, "Expression"); }
+  };
+  base.ThrowStatement = base.SpreadElement =
+    function (node, st, c) { return c(node.argument, st, "Expression"); };
+  base.TryStatement = function (node, st, c) {
+    c(node.block, st, "Statement");
+    if (node.handler) { c(node.handler, st); }
+    if (node.finalizer) { c(node.finalizer, st, "Statement"); }
+  };
+  base.CatchClause = function (node, st, c) {
+    if (node.param) { c(node.param, st, "Pattern"); }
+    c(node.body, st, "Statement");
+  };
+  base.WhileStatement = base.DoWhileStatement = function (node, st, c) {
+    c(node.test, st, "Expression");
+    c(node.body, st, "Statement");
+  };
+  base.ForStatement = function (node, st, c) {
+    if (node.init) { c(node.init, st, "ForInit"); }
+    if (node.test) { c(node.test, st, "Expression"); }
+    if (node.update) { c(node.update, st, "Expression"); }
+    c(node.body, st, "Statement");
+  };
+  base.ForInStatement = base.ForOfStatement = function (node, st, c) {
+    c(node.left, st, "ForInit");
+    c(node.right, st, "Expression");
+    c(node.body, st, "Statement");
+  };
+  base.ForInit = function (node, st, c) {
+    if (node.type === "VariableDeclaration") { c(node, st); }
+    else { c(node, st, "Expression"); }
+  };
+  base.DebuggerStatement = ignore;
+
+  base.FunctionDeclaration = function (node, st, c) { return c(node, st, "Function"); };
+  base.VariableDeclaration = function (node, st, c) {
+    for (var i = 0, list = node.declarations; i < list.length; i += 1)
+      {
+      var decl = list[i];
+
+      c(decl, st);
+    }
+  };
+  base.VariableDeclarator = function (node, st, c) {
+    c(node.id, st, "Pattern");
+    if (node.init) { c(node.init, st, "Expression"); }
+  };
+
+  base.Function = function (node, st, c) {
+    if (node.id) { c(node.id, st, "Pattern"); }
+    for (var i = 0, list = node.params; i < list.length; i += 1)
+      {
+      var param = list[i];
+
+      c(param, st, "Pattern");
+    }
+    c(node.body, st, node.expression ? "Expression" : "Statement");
+  };
+
+  base.Pattern = function (node, st, c) {
+    if (node.type === "Identifier")
+      { c(node, st, "VariablePattern"); }
+    else if (node.type === "MemberExpression")
+      { c(node, st, "MemberPattern"); }
+    else
+      { c(node, st); }
+  };
+  base.VariablePattern = ignore;
+  base.MemberPattern = skipThrough;
+  base.RestElement = function (node, st, c) { return c(node.argument, st, "Pattern"); };
+  base.ArrayPattern = function (node, st, c) {
+    for (var i = 0, list = node.elements; i < list.length; i += 1) {
+      var elt = list[i];
+
+      if (elt) { c(elt, st, "Pattern"); }
+    }
+  };
+  base.ObjectPattern = function (node, st, c) {
+    for (var i = 0, list = node.properties; i < list.length; i += 1) {
+      var prop = list[i];
+
+      if (prop.type === "Property") {
+        if (prop.computed) { c(prop.key, st, "Expression"); }
+        c(prop.value, st, "Pattern");
+      } else if (prop.type === "RestElement") {
+        c(prop.argument, st, "Pattern");
+      }
+    }
+  };
+
+  base.Expression = skipThrough;
+  base.ThisExpression = base.Super = base.MetaProperty = ignore;
+  base.ArrayExpression = function (node, st, c) {
+    for (var i = 0, list = node.elements; i < list.length; i += 1) {
+      var elt = list[i];
+
+      if (elt) { c(elt, st, "Expression"); }
+    }
+  };
+  base.ObjectExpression = function (node, st, c) {
+    for (var i = 0, list = node.properties; i < list.length; i += 1)
+      {
+      var prop = list[i];
+
+      c(prop, st);
+    }
+  };
+  base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration;
+  base.SequenceExpression = function (node, st, c) {
+    for (var i = 0, list = node.expressions; i < list.length; i += 1)
+      {
+      var expr = list[i];
+
+      c(expr, st, "Expression");
+    }
+  };
+  base.TemplateLiteral = function (node, st, c) {
+    for (var i = 0, list = node.quasis; i < list.length; i += 1)
+      {
+      var quasi = list[i];
+
+      c(quasi, st);
+    }
+
+    for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1)
+      {
+      var expr = list$1[i$1];
+
+      c(expr, st, "Expression");
+    }
+  };
+  base.TemplateElement = ignore;
+  base.UnaryExpression = base.UpdateExpression = function (node, st, c) {
+    c(node.argument, st, "Expression");
+  };
+  base.BinaryExpression = base.LogicalExpression = function (node, st, c) {
+    c(node.left, st, "Expression");
+    c(node.right, st, "Expression");
+  };
+  base.AssignmentExpression = base.AssignmentPattern = function (node, st, c) {
+    c(node.left, st, "Pattern");
+    c(node.right, st, "Expression");
+  };
+  base.ConditionalExpression = function (node, st, c) {
+    c(node.test, st, "Expression");
+    c(node.consequent, st, "Expression");
+    c(node.alternate, st, "Expression");
+  };
+  base.NewExpression = base.CallExpression = function (node, st, c) {
+    c(node.callee, st, "Expression");
+    if (node.arguments)
+      { for (var i = 0, list = node.arguments; i < list.length; i += 1)
+        {
+          var arg = list[i];
+
+          c(arg, st, "Expression");
+        } }
+  };
+  base.MemberExpression = function (node, st, c) {
+    c(node.object, st, "Expression");
+    if (node.computed) { c(node.property, st, "Expression"); }
+  };
+  base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) {
+    if (node.declaration)
+      { c(node.declaration, st, node.type === "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression"); }
+    if (node.source) { c(node.source, st, "Expression"); }
+  };
+  base.ExportAllDeclaration = function (node, st, c) {
+    if (node.exported)
+      { c(node.exported, st); }
+    c(node.source, st, "Expression");
+  };
+  base.ImportDeclaration = function (node, st, c) {
+    for (var i = 0, list = node.specifiers; i < list.length; i += 1)
+      {
+      var spec = list[i];
+
+      c(spec, st);
+    }
+    c(node.source, st, "Expression");
+  };
+  base.ImportExpression = function (node, st, c) {
+    c(node.source, st, "Expression");
+  };
+  base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.PrivateIdentifier = base.Literal = ignore;
+
+  base.TaggedTemplateExpression = function (node, st, c) {
+    c(node.tag, st, "Expression");
+    c(node.quasi, st, "Expression");
+  };
+  base.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, "Class"); };
+  base.Class = function (node, st, c) {
+    if (node.id) { c(node.id, st, "Pattern"); }
+    if (node.superClass) { c(node.superClass, st, "Expression"); }
+    c(node.body, st);
+  };
+  base.ClassBody = function (node, st, c) {
+    for (var i = 0, list = node.body; i < list.length; i += 1)
+      {
+      var elt = list[i];
+
+      c(elt, st);
+    }
+  };
+  base.MethodDefinition = base.PropertyDefinition = base.Property = function (node, st, c) {
+    if (node.computed) { c(node.key, st, "Expression"); }
+    if (node.value) { c(node.value, st, "Expression"); }
+  };
+
+  exports.ancestor = ancestor;
+  exports.base = base;
+  exports.findNodeAfter = findNodeAfter;
+  exports.findNodeAround = findNodeAround;
+  exports.findNodeAt = findNodeAt;
+  exports.findNodeBefore = findNodeBefore;
+  exports.full = full;
+  exports.fullAncestor = fullAncestor;
+  exports.make = make;
+  exports.recursive = recursive;
+  exports.simple = simple;
+
+  Object.defineProperty(exports, '__esModule', { value: true });
+
+})));

+ 443 - 0
node_modules/acorn-walk/dist/walk.mjs

@@ -0,0 +1,443 @@
+// AST walker module for Mozilla Parser API compatible trees
+
+// A simple walk is one where you simply specify callbacks to be
+// called on specific nodes. The last two arguments are optional. A
+// simple use would be
+//
+//     walk.simple(myTree, {
+//         Expression: function(node) { ... }
+//     });
+//
+// to do something with all expressions. All Parser API node types
+// can be used to identify node types, as well as Expression and
+// Statement, which denote categories of nodes.
+//
+// The base argument can be used to pass a custom (recursive)
+// walker, and state can be used to give this walked an initial
+// state.
+
+function simple(node, visitors, baseVisitor, state, override) {
+  if (!baseVisitor) { baseVisitor = base
+  ; }(function c(node, st, override) {
+    var type = override || node.type, found = visitors[type];
+    baseVisitor[type](node, st, c);
+    if (found) { found(node, st); }
+  })(node, state, override);
+}
+
+// An ancestor walk keeps an array of ancestor nodes (including the
+// current node) and passes them to the callback as third parameter
+// (and also as state parameter when no other state is present).
+function ancestor(node, visitors, baseVisitor, state, override) {
+  var ancestors = [];
+  if (!baseVisitor) { baseVisitor = base
+  ; }(function c(node, st, override) {
+    var type = override || node.type, found = visitors[type];
+    var isNew = node !== ancestors[ancestors.length - 1];
+    if (isNew) { ancestors.push(node); }
+    baseVisitor[type](node, st, c);
+    if (found) { found(node, st || ancestors, ancestors); }
+    if (isNew) { ancestors.pop(); }
+  })(node, state, override);
+}
+
+// A recursive walk is one where your functions override the default
+// walkers. They can modify and replace the state parameter that's
+// threaded through the walk, and can opt how and whether to walk
+// their child nodes (by calling their third argument on these
+// nodes).
+function recursive(node, state, funcs, baseVisitor, override) {
+  var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor
+  ;(function c(node, st, override) {
+    visitor[override || node.type](node, st, c);
+  })(node, state, override);
+}
+
+function makeTest(test) {
+  if (typeof test === "string")
+    { return function (type) { return type === test; } }
+  else if (!test)
+    { return function () { return true; } }
+  else
+    { return test }
+}
+
+var Found = function Found(node, state) { this.node = node; this.state = state; };
+
+// A full walk triggers the callback on each node
+function full(node, callback, baseVisitor, state, override) {
+  if (!baseVisitor) { baseVisitor = base; }
+  var last
+  ;(function c(node, st, override) {
+    var type = override || node.type;
+    baseVisitor[type](node, st, c);
+    if (last !== node) {
+      callback(node, st, type);
+      last = node;
+    }
+  })(node, state, override);
+}
+
+// An fullAncestor walk is like an ancestor walk, but triggers
+// the callback on each node
+function fullAncestor(node, callback, baseVisitor, state) {
+  if (!baseVisitor) { baseVisitor = base; }
+  var ancestors = [], last
+  ;(function c(node, st, override) {
+    var type = override || node.type;
+    var isNew = node !== ancestors[ancestors.length - 1];
+    if (isNew) { ancestors.push(node); }
+    baseVisitor[type](node, st, c);
+    if (last !== node) {
+      callback(node, st || ancestors, ancestors, type);
+      last = node;
+    }
+    if (isNew) { ancestors.pop(); }
+  })(node, state);
+}
+
+// Find a node with a given start, end, and type (all are optional,
+// null can be used as wildcard). Returns a {node, state} object, or
+// undefined when it doesn't find a matching node.
+function findNodeAt(node, start, end, test, baseVisitor, state) {
+  if (!baseVisitor) { baseVisitor = base; }
+  test = makeTest(test);
+  try {
+    (function c(node, st, override) {
+      var type = override || node.type;
+      if ((start == null || node.start <= start) &&
+          (end == null || node.end >= end))
+        { baseVisitor[type](node, st, c); }
+      if ((start == null || node.start === start) &&
+          (end == null || node.end === end) &&
+          test(type, node))
+        { throw new Found(node, st) }
+    })(node, state);
+  } catch (e) {
+    if (e instanceof Found) { return e }
+    throw e
+  }
+}
+
+// Find the innermost node of a given type that contains the given
+// position. Interface similar to findNodeAt.
+function findNodeAround(node, pos, test, baseVisitor, state) {
+  test = makeTest(test);
+  if (!baseVisitor) { baseVisitor = base; }
+  try {
+    (function c(node, st, override) {
+      var type = override || node.type;
+      if (node.start > pos || node.end < pos) { return }
+      baseVisitor[type](node, st, c);
+      if (test(type, node)) { throw new Found(node, st) }
+    })(node, state);
+  } catch (e) {
+    if (e instanceof Found) { return e }
+    throw e
+  }
+}
+
+// Find the outermost matching node after a given position.
+function findNodeAfter(node, pos, test, baseVisitor, state) {
+  test = makeTest(test);
+  if (!baseVisitor) { baseVisitor = base; }
+  try {
+    (function c(node, st, override) {
+      if (node.end < pos) { return }
+      var type = override || node.type;
+      if (node.start >= pos && test(type, node)) { throw new Found(node, st) }
+      baseVisitor[type](node, st, c);
+    })(node, state);
+  } catch (e) {
+    if (e instanceof Found) { return e }
+    throw e
+  }
+}
+
+// Find the outermost matching node before a given position.
+function findNodeBefore(node, pos, test, baseVisitor, state) {
+  test = makeTest(test);
+  if (!baseVisitor) { baseVisitor = base; }
+  var max
+  ;(function c(node, st, override) {
+    if (node.start > pos) { return }
+    var type = override || node.type;
+    if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node))
+      { max = new Found(node, st); }
+    baseVisitor[type](node, st, c);
+  })(node, state);
+  return max
+}
+
+// Used to create a custom walker. Will fill in all missing node
+// type properties with the defaults.
+function make(funcs, baseVisitor) {
+  var visitor = Object.create(baseVisitor || base);
+  for (var type in funcs) { visitor[type] = funcs[type]; }
+  return visitor
+}
+
+function skipThrough(node, st, c) { c(node, st); }
+function ignore(_node, _st, _c) {}
+
+// Node walkers.
+
+var base = {};
+
+base.Program = base.BlockStatement = base.StaticBlock = function (node, st, c) {
+  for (var i = 0, list = node.body; i < list.length; i += 1)
+    {
+    var stmt = list[i];
+
+    c(stmt, st, "Statement");
+  }
+};
+base.Statement = skipThrough;
+base.EmptyStatement = ignore;
+base.ExpressionStatement = base.ParenthesizedExpression = base.ChainExpression =
+  function (node, st, c) { return c(node.expression, st, "Expression"); };
+base.IfStatement = function (node, st, c) {
+  c(node.test, st, "Expression");
+  c(node.consequent, st, "Statement");
+  if (node.alternate) { c(node.alternate, st, "Statement"); }
+};
+base.LabeledStatement = function (node, st, c) { return c(node.body, st, "Statement"); };
+base.BreakStatement = base.ContinueStatement = ignore;
+base.WithStatement = function (node, st, c) {
+  c(node.object, st, "Expression");
+  c(node.body, st, "Statement");
+};
+base.SwitchStatement = function (node, st, c) {
+  c(node.discriminant, st, "Expression");
+  for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) {
+    var cs = list$1[i$1];
+
+    if (cs.test) { c(cs.test, st, "Expression"); }
+    for (var i = 0, list = cs.consequent; i < list.length; i += 1)
+      {
+      var cons = list[i];
+
+      c(cons, st, "Statement");
+    }
+  }
+};
+base.SwitchCase = function (node, st, c) {
+  if (node.test) { c(node.test, st, "Expression"); }
+  for (var i = 0, list = node.consequent; i < list.length; i += 1)
+    {
+    var cons = list[i];
+
+    c(cons, st, "Statement");
+  }
+};
+base.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) {
+  if (node.argument) { c(node.argument, st, "Expression"); }
+};
+base.ThrowStatement = base.SpreadElement =
+  function (node, st, c) { return c(node.argument, st, "Expression"); };
+base.TryStatement = function (node, st, c) {
+  c(node.block, st, "Statement");
+  if (node.handler) { c(node.handler, st); }
+  if (node.finalizer) { c(node.finalizer, st, "Statement"); }
+};
+base.CatchClause = function (node, st, c) {
+  if (node.param) { c(node.param, st, "Pattern"); }
+  c(node.body, st, "Statement");
+};
+base.WhileStatement = base.DoWhileStatement = function (node, st, c) {
+  c(node.test, st, "Expression");
+  c(node.body, st, "Statement");
+};
+base.ForStatement = function (node, st, c) {
+  if (node.init) { c(node.init, st, "ForInit"); }
+  if (node.test) { c(node.test, st, "Expression"); }
+  if (node.update) { c(node.update, st, "Expression"); }
+  c(node.body, st, "Statement");
+};
+base.ForInStatement = base.ForOfStatement = function (node, st, c) {
+  c(node.left, st, "ForInit");
+  c(node.right, st, "Expression");
+  c(node.body, st, "Statement");
+};
+base.ForInit = function (node, st, c) {
+  if (node.type === "VariableDeclaration") { c(node, st); }
+  else { c(node, st, "Expression"); }
+};
+base.DebuggerStatement = ignore;
+
+base.FunctionDeclaration = function (node, st, c) { return c(node, st, "Function"); };
+base.VariableDeclaration = function (node, st, c) {
+  for (var i = 0, list = node.declarations; i < list.length; i += 1)
+    {
+    var decl = list[i];
+
+    c(decl, st);
+  }
+};
+base.VariableDeclarator = function (node, st, c) {
+  c(node.id, st, "Pattern");
+  if (node.init) { c(node.init, st, "Expression"); }
+};
+
+base.Function = function (node, st, c) {
+  if (node.id) { c(node.id, st, "Pattern"); }
+  for (var i = 0, list = node.params; i < list.length; i += 1)
+    {
+    var param = list[i];
+
+    c(param, st, "Pattern");
+  }
+  c(node.body, st, node.expression ? "Expression" : "Statement");
+};
+
+base.Pattern = function (node, st, c) {
+  if (node.type === "Identifier")
+    { c(node, st, "VariablePattern"); }
+  else if (node.type === "MemberExpression")
+    { c(node, st, "MemberPattern"); }
+  else
+    { c(node, st); }
+};
+base.VariablePattern = ignore;
+base.MemberPattern = skipThrough;
+base.RestElement = function (node, st, c) { return c(node.argument, st, "Pattern"); };
+base.ArrayPattern = function (node, st, c) {
+  for (var i = 0, list = node.elements; i < list.length; i += 1) {
+    var elt = list[i];
+
+    if (elt) { c(elt, st, "Pattern"); }
+  }
+};
+base.ObjectPattern = function (node, st, c) {
+  for (var i = 0, list = node.properties; i < list.length; i += 1) {
+    var prop = list[i];
+
+    if (prop.type === "Property") {
+      if (prop.computed) { c(prop.key, st, "Expression"); }
+      c(prop.value, st, "Pattern");
+    } else if (prop.type === "RestElement") {
+      c(prop.argument, st, "Pattern");
+    }
+  }
+};
+
+base.Expression = skipThrough;
+base.ThisExpression = base.Super = base.MetaProperty = ignore;
+base.ArrayExpression = function (node, st, c) {
+  for (var i = 0, list = node.elements; i < list.length; i += 1) {
+    var elt = list[i];
+
+    if (elt) { c(elt, st, "Expression"); }
+  }
+};
+base.ObjectExpression = function (node, st, c) {
+  for (var i = 0, list = node.properties; i < list.length; i += 1)
+    {
+    var prop = list[i];
+
+    c(prop, st);
+  }
+};
+base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration;
+base.SequenceExpression = function (node, st, c) {
+  for (var i = 0, list = node.expressions; i < list.length; i += 1)
+    {
+    var expr = list[i];
+
+    c(expr, st, "Expression");
+  }
+};
+base.TemplateLiteral = function (node, st, c) {
+  for (var i = 0, list = node.quasis; i < list.length; i += 1)
+    {
+    var quasi = list[i];
+
+    c(quasi, st);
+  }
+
+  for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1)
+    {
+    var expr = list$1[i$1];
+
+    c(expr, st, "Expression");
+  }
+};
+base.TemplateElement = ignore;
+base.UnaryExpression = base.UpdateExpression = function (node, st, c) {
+  c(node.argument, st, "Expression");
+};
+base.BinaryExpression = base.LogicalExpression = function (node, st, c) {
+  c(node.left, st, "Expression");
+  c(node.right, st, "Expression");
+};
+base.AssignmentExpression = base.AssignmentPattern = function (node, st, c) {
+  c(node.left, st, "Pattern");
+  c(node.right, st, "Expression");
+};
+base.ConditionalExpression = function (node, st, c) {
+  c(node.test, st, "Expression");
+  c(node.consequent, st, "Expression");
+  c(node.alternate, st, "Expression");
+};
+base.NewExpression = base.CallExpression = function (node, st, c) {
+  c(node.callee, st, "Expression");
+  if (node.arguments)
+    { for (var i = 0, list = node.arguments; i < list.length; i += 1)
+      {
+        var arg = list[i];
+
+        c(arg, st, "Expression");
+      } }
+};
+base.MemberExpression = function (node, st, c) {
+  c(node.object, st, "Expression");
+  if (node.computed) { c(node.property, st, "Expression"); }
+};
+base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) {
+  if (node.declaration)
+    { c(node.declaration, st, node.type === "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression"); }
+  if (node.source) { c(node.source, st, "Expression"); }
+};
+base.ExportAllDeclaration = function (node, st, c) {
+  if (node.exported)
+    { c(node.exported, st); }
+  c(node.source, st, "Expression");
+};
+base.ImportDeclaration = function (node, st, c) {
+  for (var i = 0, list = node.specifiers; i < list.length; i += 1)
+    {
+    var spec = list[i];
+
+    c(spec, st);
+  }
+  c(node.source, st, "Expression");
+};
+base.ImportExpression = function (node, st, c) {
+  c(node.source, st, "Expression");
+};
+base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.PrivateIdentifier = base.Literal = ignore;
+
+base.TaggedTemplateExpression = function (node, st, c) {
+  c(node.tag, st, "Expression");
+  c(node.quasi, st, "Expression");
+};
+base.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, "Class"); };
+base.Class = function (node, st, c) {
+  if (node.id) { c(node.id, st, "Pattern"); }
+  if (node.superClass) { c(node.superClass, st, "Expression"); }
+  c(node.body, st);
+};
+base.ClassBody = function (node, st, c) {
+  for (var i = 0, list = node.body; i < list.length; i += 1)
+    {
+    var elt = list[i];
+
+    c(elt, st);
+  }
+};
+base.MethodDefinition = base.PropertyDefinition = base.Property = function (node, st, c) {
+  if (node.computed) { c(node.key, st, "Expression"); }
+  if (node.value) { c(node.value, st, "Expression"); }
+};
+
+export { ancestor, base, findNodeAfter, findNodeAround, findNodeAt, findNodeBefore, full, fullAncestor, make, recursive, simple };

+ 75 - 0
node_modules/acorn-walk/package.json

@@ -0,0 +1,75 @@
+{
+  "_from": "acorn-walk@^8.2.0",
+  "_id": "acorn-walk@8.2.0",
+  "_inBundle": false,
+  "_integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+  "_location": "/acorn-walk",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "acorn-walk@^8.2.0",
+    "name": "acorn-walk",
+    "escapedName": "acorn-walk",
+    "rawSpec": "^8.2.0",
+    "saveSpec": null,
+    "fetchSpec": "^8.2.0"
+  },
+  "_requiredBy": [
+    "/vm2"
+  ],
+  "_resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+  "_shasum": "741210f2e2426454508853a2f44d0ab83b7f69c1",
+  "_spec": "acorn-walk@^8.2.0",
+  "_where": "D:\\2022\\3\\Mazui\\node_modules\\vm2",
+  "bugs": {
+    "url": "https://github.com/acornjs/acorn/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "ECMAScript (ESTree) AST walker",
+  "engines": {
+    "node": ">=0.4.0"
+  },
+  "exports": {
+    ".": [
+      {
+        "import": "./dist/walk.mjs",
+        "require": "./dist/walk.js",
+        "default": "./dist/walk.js"
+      },
+      "./dist/walk.js"
+    ],
+    "./package.json": "./package.json"
+  },
+  "homepage": "https://github.com/acornjs/acorn",
+  "license": "MIT",
+  "main": "dist/walk.js",
+  "maintainers": [
+    {
+      "name": "Marijn Haverbeke",
+      "email": "marijnh@gmail.com",
+      "url": "https://marijnhaverbeke.nl"
+    },
+    {
+      "name": "Ingvar Stepanyan",
+      "email": "me@rreverser.com",
+      "url": "https://rreverser.com/"
+    },
+    {
+      "name": "Adrian Heine",
+      "url": "http://adrianheine.de"
+    }
+  ],
+  "module": "dist/walk.mjs",
+  "name": "acorn-walk",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/acornjs/acorn.git"
+  },
+  "scripts": {
+    "prepare": "cd ..; npm run build:walk"
+  },
+  "types": "dist/walk.d.ts",
+  "version": "8.2.0"
+}

+ 810 - 0
node_modules/acorn/CHANGELOG.md

@@ -0,0 +1,810 @@
+## 8.8.0 (2022-07-21)
+
+### Bug fixes
+
+Allow parentheses around spread args in destructuring object assignment.
+
+Fix an issue where the tree contained `directive` properties in when parsing with a language version that doesn't support them.
+
+### New features
+
+Support hashbang comments by default in ECMAScript 2023 and later.
+
+## 8.7.1 (2021-04-26)
+
+### Bug fixes
+
+Stop handling `"use strict"` directives in ECMAScript versions before 5.
+
+Fix an issue where duplicate quoted export names in `export *` syntax were incorrectly checked.
+
+Add missing type for `tokTypes`.
+
+## 8.7.0 (2021-12-27)
+
+### New features
+
+Support quoted export names.
+
+Upgrade to Unicode 14.
+
+Add support for Unicode 13 properties in regular expressions.
+
+### Bug fixes
+
+Use a loop to find line breaks, because the existing regexp search would overrun the end of the searched range and waste a lot of time in minified code.
+
+## 8.6.0 (2021-11-18)
+
+### Bug fixes
+
+Fix a bug where an object literal with multiple `__proto__` properties would incorrectly be accepted if a later property value held an assigment.
+
+### New features
+
+Support class private fields with the `in` operator.
+
+## 8.5.0 (2021-09-06)
+
+### Bug fixes
+
+Improve context-dependent tokenization in a number of corner cases.
+
+Fix location tracking after a 0x2028 or 0x2029 character in a string literal (which before did not increase the line number).
+
+Fix an issue where arrow function bodies in for loop context would inappropriately consume `in` operators.
+
+Fix wrong end locations stored on SequenceExpression nodes.
+
+Implement restriction that `for`/`of` loop LHS can't start with `let`.
+
+### New features
+
+Add support for ES2022 class static blocks.
+
+Allow multiple input files to be passed to the CLI tool.
+
+## 8.4.1 (2021-06-24)
+
+### Bug fixes
+
+Fix a bug where `allowAwaitOutsideFunction` would allow `await` in class field initializers, and setting `ecmaVersion` to 13 or higher would allow top-level await in non-module sources.
+
+## 8.4.0 (2021-06-11)
+
+### New features
+
+A new option, `allowSuperOutsideMethod`, can be used to suppress the error when `super` is used in the wrong context.
+
+## 8.3.0 (2021-05-31)
+
+### New features
+
+Default `allowAwaitOutsideFunction` to true for ECMAScript 2022 an higher.
+
+Add support for the `d` ([indices](https://github.com/tc39/proposal-regexp-match-indices)) regexp flag.
+
+## 8.2.4 (2021-05-04)
+
+### Bug fixes
+
+Fix spec conformity in corner case 'for await (async of ...)'.
+
+## 8.2.3 (2021-05-04)
+
+### Bug fixes
+
+Fix an issue where the library couldn't parse 'for (async of ...)'.
+
+Fix a bug in UTF-16 decoding that would read characters incorrectly in some circumstances.
+
+## 8.2.2 (2021-04-29)
+
+### Bug fixes
+
+Fix a bug where a class field initialized to an async arrow function wouldn't allow await inside it. Same issue existed for generator arrow functions with yield.
+
+## 8.2.1 (2021-04-24)
+
+### Bug fixes
+
+Fix a regression introduced in 8.2.0 where static or async class methods with keyword names fail to parse.
+
+## 8.2.0 (2021-04-24)
+
+### New features
+
+Add support for ES2022 class fields and private methods.
+
+## 8.1.1 (2021-04-12)
+
+### Various
+
+Stop shipping source maps in the NPM package.
+
+## 8.1.0 (2021-03-09)
+
+### Bug fixes
+
+Fix a spurious error in nested destructuring arrays.
+
+### New features
+
+Expose `allowAwaitOutsideFunction` in CLI interface.
+
+Make `allowImportExportAnywhere` also apply to `import.meta`.
+
+## 8.0.5 (2021-01-25)
+
+### Bug fixes
+
+Adjust package.json to work with Node 12.16.0 and 13.0-13.6.
+
+## 8.0.4 (2020-10-05)
+
+### Bug fixes
+
+Make `await x ** y` an error, following the spec.
+
+Fix potentially exponential regular expression.
+
+## 8.0.3 (2020-10-02)
+
+### Bug fixes
+
+Fix a wasteful loop during `Parser` creation when setting `ecmaVersion` to `"latest"`.
+
+## 8.0.2 (2020-09-30)
+
+### Bug fixes
+
+Make the TypeScript types reflect the current allowed values for `ecmaVersion`.
+
+Fix another regexp/division tokenizer issue.
+
+## 8.0.1 (2020-08-12)
+
+### Bug fixes
+
+Provide the correct value in the `version` export.
+
+## 8.0.0 (2020-08-12)
+
+### Bug fixes
+
+Disallow expressions like `(a = b) = c`.
+
+Make non-octal escape sequences a syntax error in strict mode.
+
+### New features
+
+The package can now be loaded directly as an ECMAScript module in node 13+.
+
+Update to the set of Unicode properties from ES2021.
+
+### Breaking changes
+
+The `ecmaVersion` option is now required. For the moment, omitting it will still work with a warning, but that will change in a future release.
+
+Some changes to method signatures that may be used by plugins.
+
+## 7.4.0 (2020-08-03)
+
+### New features
+
+Add support for logical assignment operators.
+
+Add support for numeric separators.
+
+## 7.3.1 (2020-06-11)
+
+### Bug fixes
+
+Make the string in the `version` export match the actual library version.
+
+## 7.3.0 (2020-06-11)
+
+### Bug fixes
+
+Fix a bug that caused parsing of object patterns with a property named `set` that had a default value to fail.
+
+### New features
+
+Add support for optional chaining (`?.`).
+
+## 7.2.0 (2020-05-09)
+
+### Bug fixes
+
+Fix precedence issue in parsing of async arrow functions.
+
+### New features
+
+Add support for nullish coalescing.
+
+Add support for `import.meta`.
+
+Support `export * as ...` syntax.
+
+Upgrade to Unicode 13.
+
+## 6.4.1 (2020-03-09)
+
+### Bug fixes
+
+More carefully check for valid UTF16 surrogate pairs in regexp validator.
+
+## 7.1.1 (2020-03-01)
+
+### Bug fixes
+
+Treat `\8` and `\9` as invalid escapes in template strings.
+
+Allow unicode escapes in property names that are keywords.
+
+Don't error on an exponential operator expression as argument to `await`.
+
+More carefully check for valid UTF16 surrogate pairs in regexp validator.
+
+## 7.1.0 (2019-09-24)
+
+### Bug fixes
+
+Disallow trailing object literal commas when ecmaVersion is less than 5.
+
+### New features
+
+Add a static `acorn` property to the `Parser` class that contains the entire module interface, to allow plugins to access the instance of the library that they are acting on.
+
+## 7.0.0 (2019-08-13)
+
+### Breaking changes
+
+Changes the node format for dynamic imports to use the `ImportExpression` node type, as defined in [ESTree](https://github.com/estree/estree/blob/master/es2020.md#importexpression).
+
+Makes 10 (ES2019) the default value for the `ecmaVersion` option.
+
+## 6.3.0 (2019-08-12)
+
+### New features
+
+`sourceType: "module"` can now be used even when `ecmaVersion` is less than 6, to parse module-style code that otherwise conforms to an older standard.
+
+## 6.2.1 (2019-07-21)
+
+### Bug fixes
+
+Fix bug causing Acorn to treat some characters as identifier characters that shouldn't be treated as such.
+
+Fix issue where setting the `allowReserved` option to `"never"` allowed reserved words in some circumstances.
+
+## 6.2.0 (2019-07-04)
+
+### Bug fixes
+
+Improve valid assignment checking in `for`/`in` and `for`/`of` loops.
+
+Disallow binding `let` in patterns.
+
+### New features
+
+Support bigint syntax with `ecmaVersion` >= 11.
+
+Support dynamic `import` syntax with `ecmaVersion` >= 11.
+
+Upgrade to Unicode version 12.
+
+## 6.1.1 (2019-02-27)
+
+### Bug fixes
+
+Fix bug that caused parsing default exports of with names to fail.
+
+## 6.1.0 (2019-02-08)
+
+### Bug fixes
+
+Fix scope checking when redefining a `var` as a lexical binding.
+
+### New features
+
+Split up `parseSubscripts` to use an internal `parseSubscript` method to make it easier to extend with plugins.
+
+## 6.0.7 (2019-02-04)
+
+### Bug fixes
+
+Check that exported bindings are defined.
+
+Don't treat `\u180e` as a whitespace character.
+
+Check for duplicate parameter names in methods.
+
+Don't allow shorthand properties when they are generators or async methods.
+
+Forbid binding `await` in async arrow function's parameter list.
+
+## 6.0.6 (2019-01-30)
+
+### Bug fixes
+
+The content of class declarations and expressions is now always parsed in strict mode.
+
+Don't allow `let` or `const` to bind the variable name `let`.
+
+Treat class declarations as lexical.
+
+Don't allow a generator function declaration as the sole body of an `if` or `else`.
+
+Ignore `"use strict"` when after an empty statement.
+
+Allow string line continuations with special line terminator characters.
+
+Treat `for` bodies as part of the `for` scope when checking for conflicting bindings.
+
+Fix bug with parsing `yield` in a `for` loop initializer.
+
+Implement special cases around scope checking for functions.
+
+## 6.0.5 (2019-01-02)
+
+### Bug fixes
+
+Fix TypeScript type for `Parser.extend` and add `allowAwaitOutsideFunction` to options type.
+
+Don't treat `let` as a keyword when the next token is `{` on the next line.
+
+Fix bug that broke checking for parentheses around an object pattern in a destructuring assignment when `preserveParens` was on.
+
+## 6.0.4 (2018-11-05)
+
+### Bug fixes
+
+Further improvements to tokenizing regular expressions in corner cases.
+
+## 6.0.3 (2018-11-04)
+
+### Bug fixes
+
+Fix bug in tokenizing an expression-less return followed by a function followed by a regular expression.
+
+Remove stray symlink in the package tarball.
+
+## 6.0.2 (2018-09-26)
+
+### Bug fixes
+
+Fix bug where default expressions could fail to parse inside an object destructuring assignment expression.
+
+## 6.0.1 (2018-09-14)
+
+### Bug fixes
+
+Fix wrong value in `version` export.
+
+## 6.0.0 (2018-09-14)
+
+### Bug fixes
+
+Better handle variable-redefinition checks for catch bindings and functions directly under if statements.
+
+Forbid `new.target` in top-level arrow functions.
+
+Fix issue with parsing a regexp after `yield` in some contexts.
+
+### New features
+
+The package now comes with TypeScript definitions.
+
+### Breaking changes
+
+The default value of the `ecmaVersion` option is now 9 (2018).
+
+Plugins work differently, and will have to be rewritten to work with this version.
+
+The loose parser and walker have been moved into separate packages (`acorn-loose` and `acorn-walk`).
+
+## 5.7.3 (2018-09-10)
+
+### Bug fixes
+
+Fix failure to tokenize regexps after expressions like `x.of`.
+
+Better error message for unterminated template literals.
+
+## 5.7.2 (2018-08-24)
+
+### Bug fixes
+
+Properly handle `allowAwaitOutsideFunction` in for statements.
+
+Treat function declarations at the top level of modules like let bindings.
+
+Don't allow async function declarations as the only statement under a label.
+
+## 5.7.0 (2018-06-15)
+
+### New features
+
+Upgraded to Unicode 11.
+
+## 5.6.0 (2018-05-31)
+
+### New features
+
+Allow U+2028 and U+2029 in string when ECMAVersion >= 10.
+
+Allow binding-less catch statements when ECMAVersion >= 10.
+
+Add `allowAwaitOutsideFunction` option for parsing top-level `await`.
+
+## 5.5.3 (2018-03-08)
+
+### Bug fixes
+
+A _second_ republish of the code in 5.5.1, this time with yarn, to hopefully get valid timestamps.
+
+## 5.5.2 (2018-03-08)
+
+### Bug fixes
+
+A republish of the code in 5.5.1 in an attempt to solve an issue with the file timestamps in the npm package being 0.
+
+## 5.5.1 (2018-03-06)
+
+### Bug fixes
+
+Fix misleading error message for octal escapes in template strings.
+
+## 5.5.0 (2018-02-27)
+
+### New features
+
+The identifier character categorization is now based on Unicode version 10.
+
+Acorn will now validate the content of regular expressions, including new ES9 features.
+
+## 5.4.0 (2018-02-01)
+
+### Bug fixes
+
+Disallow duplicate or escaped flags on regular expressions.
+
+Disallow octal escapes in strings in strict mode.
+
+### New features
+
+Add support for async iteration.
+
+Add support for object spread and rest.
+
+## 5.3.0 (2017-12-28)
+
+### Bug fixes
+
+Fix parsing of floating point literals with leading zeroes in loose mode.
+
+Allow duplicate property names in object patterns.
+
+Don't allow static class methods named `prototype`.
+
+Disallow async functions directly under `if` or `else`.
+
+Parse right-hand-side of `for`/`of` as an assignment expression.
+
+Stricter parsing of `for`/`in`.
+
+Don't allow unicode escapes in contextual keywords.
+
+### New features
+
+Parsing class members was factored into smaller methods to allow plugins to hook into it.
+
+## 5.2.1 (2017-10-30)
+
+### Bug fixes
+
+Fix a token context corruption bug.
+
+## 5.2.0 (2017-10-30)
+
+### Bug fixes
+
+Fix token context tracking for `class` and `function` in property-name position.
+
+Make sure `%*` isn't parsed as a valid operator.
+
+Allow shorthand properties `get` and `set` to be followed by default values.
+
+Disallow `super` when not in callee or object position.
+
+### New features
+
+Support [`directive` property](https://github.com/estree/estree/compare/b3de58c9997504d6fba04b72f76e6dd1619ee4eb...1da8e603237144f44710360f8feb7a9977e905e0) on directive expression statements.
+
+## 5.1.2 (2017-09-04)
+
+### Bug fixes
+
+Disable parsing of legacy HTML-style comments in modules.
+
+Fix parsing of async methods whose names are keywords.
+
+## 5.1.1 (2017-07-06)
+
+### Bug fixes
+
+Fix problem with disambiguating regexp and division after a class.
+
+## 5.1.0 (2017-07-05)
+
+### Bug fixes
+
+Fix tokenizing of regexps in an object-desctructuring `for`/`of` loop and after `yield`.
+
+Parse zero-prefixed numbers with non-octal digits as decimal.
+
+Allow object/array patterns in rest parameters.
+
+Don't error when `yield` is used as a property name.
+
+Allow `async` as a shorthand object property.
+
+### New features
+
+Implement the [template literal revision proposal](https://github.com/tc39/proposal-template-literal-revision) for ES9.
+
+## 5.0.3 (2017-04-01)
+
+### Bug fixes
+
+Fix spurious duplicate variable definition errors for named functions.
+
+## 5.0.2 (2017-03-30)
+
+### Bug fixes
+
+A binary operator after a parenthesized arrow expression is no longer incorrectly treated as an error.
+
+## 5.0.0 (2017-03-28)
+
+### Bug fixes
+
+Raise an error for duplicated lexical bindings.
+
+Fix spurious error when an assignement expression occurred after a spread expression.
+
+Accept regular expressions after `of` (in `for`/`of`), `yield` (in a generator), and braced arrow functions.
+
+Allow labels in front or `var` declarations, even in strict mode.
+
+### Breaking changes
+
+Parse declarations following `export default` as declaration nodes, not expressions. This means that class and function declarations nodes can now have `null` as their `id`.
+
+## 4.0.11 (2017-02-07)
+
+### Bug fixes
+
+Allow all forms of member expressions to be parenthesized as lvalue.
+
+## 4.0.10 (2017-02-07)
+
+### Bug fixes
+
+Don't expect semicolons after default-exported functions or classes, even when they are expressions.
+
+Check for use of `'use strict'` directives in non-simple parameter functions, even when already in strict mode.
+
+## 4.0.9 (2017-02-06)
+
+### Bug fixes
+
+Fix incorrect error raised for parenthesized simple assignment targets, so that `(x) = 1` parses again.
+
+## 4.0.8 (2017-02-03)
+
+### Bug fixes
+
+Solve spurious parenthesized pattern errors by temporarily erring on the side of accepting programs that our delayed errors don't handle correctly yet.
+
+## 4.0.7 (2017-02-02)
+
+### Bug fixes
+
+Accept invalidly rejected code like `(x).y = 2` again.
+
+Don't raise an error when a function _inside_ strict code has a non-simple parameter list.
+
+## 4.0.6 (2017-02-02)
+
+### Bug fixes
+
+Fix exponential behavior (manifesting itself as a complete hang for even relatively small source files) introduced by the new 'use strict' check.
+
+## 4.0.5 (2017-02-02)
+
+### Bug fixes
+
+Disallow parenthesized pattern expressions.
+
+Allow keywords as export names.
+
+Don't allow the `async` keyword to be parenthesized.
+
+Properly raise an error when a keyword contains a character escape.
+
+Allow `"use strict"` to appear after other string literal expressions.
+
+Disallow labeled declarations.
+
+## 4.0.4 (2016-12-19)
+
+### Bug fixes
+
+Fix crash when `export` was followed by a keyword that can't be
+exported.
+
+## 4.0.3 (2016-08-16)
+
+### Bug fixes
+
+Allow regular function declarations inside single-statement `if` branches in loose mode. Forbid them entirely in strict mode.
+
+Properly parse properties named `async` in ES2017 mode.
+
+Fix bug where reserved words were broken in ES2017 mode.
+
+## 4.0.2 (2016-08-11)
+
+### Bug fixes
+
+Don't ignore period or 'e' characters after octal numbers.
+
+Fix broken parsing for call expressions in default parameter values of arrow functions.
+
+## 4.0.1 (2016-08-08)
+
+### Bug fixes
+
+Fix false positives in duplicated export name errors.
+
+## 4.0.0 (2016-08-07)
+
+### Breaking changes
+
+The default `ecmaVersion` option value is now 7.
+
+A number of internal method signatures changed, so plugins might need to be updated.
+
+### Bug fixes
+
+The parser now raises errors on duplicated export names.
+
+`arguments` and `eval` can now be used in shorthand properties.
+
+Duplicate parameter names in non-simple argument lists now always produce an error.
+
+### New features
+
+The `ecmaVersion` option now also accepts year-style version numbers
+(2015, etc).
+
+Support for `async`/`await` syntax when `ecmaVersion` is >= 8.
+
+Support for trailing commas in call expressions when `ecmaVersion` is >= 8.
+
+## 3.3.0 (2016-07-25)
+
+### Bug fixes
+
+Fix bug in tokenizing of regexp operator after a function declaration.
+
+Fix parser crash when parsing an array pattern with a hole.
+
+### New features
+
+Implement check against complex argument lists in functions that enable strict mode in ES7.
+
+## 3.2.0 (2016-06-07)
+
+### Bug fixes
+
+Improve handling of lack of unicode regexp support in host
+environment.
+
+Properly reject shorthand properties whose name is a keyword.
+
+### New features
+
+Visitors created with `visit.make` now have their base as _prototype_, rather than copying properties into a fresh object.
+
+## 3.1.0 (2016-04-18)
+
+### Bug fixes
+
+Properly tokenize the division operator directly after a function expression.
+
+Allow trailing comma in destructuring arrays.
+
+## 3.0.4 (2016-02-25)
+
+### Fixes
+
+Allow update expressions as left-hand-side of the ES7 exponential operator.
+
+## 3.0.2 (2016-02-10)
+
+### Fixes
+
+Fix bug that accidentally made `undefined` a reserved word when parsing ES7.
+
+## 3.0.0 (2016-02-10)
+
+### Breaking changes
+
+The default value of the `ecmaVersion` option is now 6 (used to be 5).
+
+Support for comprehension syntax (which was dropped from the draft spec) has been removed.
+
+### Fixes
+
+`let` and `yield` are now “contextual keywords”, meaning you can mostly use them as identifiers in ES5 non-strict code.
+
+A parenthesized class or function expression after `export default` is now parsed correctly.
+
+### New features
+
+When `ecmaVersion` is set to 7, Acorn will parse the exponentiation operator (`**`).
+
+The identifier character ranges are now based on Unicode 8.0.0.
+
+Plugins can now override the `raiseRecoverable` method to override the way non-critical errors are handled.
+
+## 2.7.0 (2016-01-04)
+
+### Fixes
+
+Stop allowing rest parameters in setters.
+
+Disallow `y` rexexp flag in ES5.
+
+Disallow `\00` and `\000` escapes in strict mode.
+
+Raise an error when an import name is a reserved word.
+
+## 2.6.2 (2015-11-10)
+
+### Fixes
+
+Don't crash when no options object is passed.
+
+## 2.6.0 (2015-11-09)
+
+### Fixes
+
+Add `await` as a reserved word in module sources.
+
+Disallow `yield` in a parameter default value for a generator.
+
+Forbid using a comma after a rest pattern in an array destructuring.
+
+### New features
+
+Support parsing stdin in command-line tool.
+
+## 2.5.0 (2015-10-27)
+
+### Fixes
+
+Fix tokenizer support in the command-line tool.
+
+Stop allowing `new.target` outside of functions.
+
+Remove legacy `guard` and `guardedHandler` properties from try nodes.
+
+Stop allowing multiple `__proto__` properties on an object literal in strict mode.
+
+Don't allow rest parameters to be non-identifier patterns.
+
+Check for duplicate paramter names in arrow functions.

+ 21 - 0
node_modules/acorn/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (C) 2012-2022 by various contributors (see AUTHORS)
+
+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, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 273 - 0
node_modules/acorn/README.md

@@ -0,0 +1,273 @@
+# Acorn
+
+A tiny, fast JavaScript parser written in JavaScript.
+
+## Community
+
+Acorn is open source software released under an
+[MIT license](https://github.com/acornjs/acorn/blob/master/acorn/LICENSE).
+
+You are welcome to
+[report bugs](https://github.com/acornjs/acorn/issues) or create pull
+requests on [github](https://github.com/acornjs/acorn). For questions
+and discussion, please use the
+[Tern discussion forum](https://discuss.ternjs.net).
+
+## Installation
+
+The easiest way to install acorn is from [`npm`](https://www.npmjs.com/):
+
+```sh
+npm install acorn
+```
+
+Alternately, you can download the source and build acorn yourself:
+
+```sh
+git clone https://github.com/acornjs/acorn.git
+cd acorn
+npm install
+```
+
+## Interface
+
+**parse**`(input, options)` is the main interface to the library. The
+`input` parameter is a string, `options` must be an object setting
+some of the options listed below. The return value will be an abstract
+syntax tree object as specified by the [ESTree
+spec](https://github.com/estree/estree).
+
+```javascript
+let acorn = require("acorn");
+console.log(acorn.parse("1 + 1", {ecmaVersion: 2020}));
+```
+
+When encountering a syntax error, the parser will raise a
+`SyntaxError` object with a meaningful message. The error object will
+have a `pos` property that indicates the string offset at which the
+error occurred, and a `loc` object that contains a `{line, column}`
+object referring to that same position.
+
+Options are provided by in a second argument, which should be an
+object containing any of these fields (only `ecmaVersion` is
+required):
+
+- **ecmaVersion**: Indicates the ECMAScript version to parse. Must be
+  either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 (2019),
+  11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"` (the
+  latest the library supports). This influences support for strict
+  mode, the set of reserved words, and support for new syntax
+  features.
+
+  **NOTE**: Only 'stage 4' (finalized) ECMAScript features are being
+  implemented by Acorn. Other proposed new features must be
+  implemented through plugins.
+
+- **sourceType**: Indicate the mode the code should be parsed in. Can be
+  either `"script"` or `"module"`. This influences global strict mode
+  and parsing of `import` and `export` declarations.
+
+  **NOTE**: If set to `"module"`, then static `import` / `export` syntax
+  will be valid, even if `ecmaVersion` is less than 6.
+
+- **onInsertedSemicolon**: If given a callback, that callback will be
+  called whenever a missing semicolon is inserted by the parser. The
+  callback will be given the character offset of the point where the
+  semicolon is inserted as argument, and if `locations` is on, also a
+  `{line, column}` object representing this position.
+
+- **onTrailingComma**: Like `onInsertedSemicolon`, but for trailing
+  commas.
+
+- **allowReserved**: If `false`, using a reserved word will generate
+  an error. Defaults to `true` for `ecmaVersion` 3, `false` for higher
+  versions. When given the value `"never"`, reserved words and
+  keywords can also not be used as property names (as in Internet
+  Explorer's old parser).
+
+- **allowReturnOutsideFunction**: By default, a return statement at
+  the top level raises an error. Set this to `true` to accept such
+  code.
+
+- **allowImportExportEverywhere**: By default, `import` and `export`
+  declarations can only appear at a program's top level. Setting this
+  option to `true` allows them anywhere where a statement is allowed,
+  and also allows `import.meta` expressions to appear in scripts
+  (when `sourceType` is not `"module"`).
+
+- **allowAwaitOutsideFunction**: If `false`, `await` expressions can
+  only appear inside `async` functions. Defaults to `true` for
+  `ecmaVersion` 2022 and later, `false` for lower versions. Setting this option to
+  `true` allows to have top-level `await` expressions. They are
+  still not allowed in non-`async` functions, though.
+
+- **allowSuperOutsideMethod**: By default, `super` outside a method
+  raises an error. Set this to `true` to accept such code.
+
+- **allowHashBang**: When this is enabled, if the code starts with the
+  characters `#!` (as in a shellscript), the first line will be
+  treated as a comment. Defaults to true when `ecmaVersion` >= 2023.
+
+- **locations**: When `true`, each node has a `loc` object attached
+  with `start` and `end` subobjects, each of which contains the
+  one-based line and zero-based column numbers in `{line, column}`
+  form. Default is `false`.
+
+- **onToken**: If a function is passed for this option, each found
+  token will be passed in same format as tokens returned from
+  `tokenizer().getToken()`.
+
+  If array is passed, each found token is pushed to it.
+
+  Note that you are not allowed to call the parser from the
+  callback—that will corrupt its internal state.
+
+- **onComment**: If a function is passed for this option, whenever a
+  comment is encountered the function will be called with the
+  following parameters:
+
+  - `block`: `true` if the comment is a block comment, false if it
+    is a line comment.
+  - `text`: The content of the comment.
+  - `start`: Character offset of the start of the comment.
+  - `end`: Character offset of the end of the comment.
+
+  When the `locations` options is on, the `{line, column}` locations
+  of the comment’s start and end are passed as two additional
+  parameters.
+
+  If array is passed for this option, each found comment is pushed
+  to it as object in Esprima format:
+
+  ```javascript
+  {
+    "type": "Line" | "Block",
+    "value": "comment text",
+    "start": Number,
+    "end": Number,
+    // If `locations` option is on:
+    "loc": {
+      "start": {line: Number, column: Number}
+      "end": {line: Number, column: Number}
+    },
+    // If `ranges` option is on:
+    "range": [Number, Number]
+  }
+  ```
+
+  Note that you are not allowed to call the parser from the
+  callback—that will corrupt its internal state.
+
+- **ranges**: Nodes have their start and end characters offsets
+  recorded in `start` and `end` properties (directly on the node,
+  rather than the `loc` object, which holds line/column data. To also
+  add a
+  [semi-standardized](https://bugzilla.mozilla.org/show_bug.cgi?id=745678)
+  `range` property holding a `[start, end]` array with the same
+  numbers, set the `ranges` option to `true`.
+
+- **program**: It is possible to parse multiple files into a single
+  AST by passing the tree produced by parsing the first file as the
+  `program` option in subsequent parses. This will add the toplevel
+  forms of the parsed file to the "Program" (top) node of an existing
+  parse tree.
+
+- **sourceFile**: When the `locations` option is `true`, you can pass
+  this option to add a `source` attribute in every node’s `loc`
+  object. Note that the contents of this option are not examined or
+  processed in any way; you are free to use whatever format you
+  choose.
+
+- **directSourceFile**: Like `sourceFile`, but a `sourceFile` property
+  will be added (regardless of the `location` option) directly to the
+  nodes, rather than the `loc` object.
+
+- **preserveParens**: If this option is `true`, parenthesized expressions
+  are represented by (non-standard) `ParenthesizedExpression` nodes
+  that have a single `expression` property containing the expression
+  inside parentheses.
+
+**parseExpressionAt**`(input, offset, options)` will parse a single
+expression in a string, and return its AST. It will not complain if
+there is more of the string left after the expression.
+
+**tokenizer**`(input, options)` returns an object with a `getToken`
+method that can be called repeatedly to get the next token, a `{start,
+end, type, value}` object (with added `loc` property when the
+`locations` option is enabled and `range` property when the `ranges`
+option is enabled). When the token's type is `tokTypes.eof`, you
+should stop calling the method, since it will keep returning that same
+token forever.
+
+In ES6 environment, returned result can be used as any other
+protocol-compliant iterable:
+
+```javascript
+for (let token of acorn.tokenizer(str)) {
+  // iterate over the tokens
+}
+
+// transform code to array of tokens:
+var tokens = [...acorn.tokenizer(str)];
+```
+
+**tokTypes** holds an object mapping names to the token type objects
+that end up in the `type` properties of tokens.
+
+**getLineInfo**`(input, offset)` can be used to get a `{line,
+column}` object for a given program string and offset.
+
+### The `Parser` class
+
+Instances of the **`Parser`** class contain all the state and logic
+that drives a parse. It has static methods `parse`,
+`parseExpressionAt`, and `tokenizer` that match the top-level
+functions by the same name.
+
+When extending the parser with plugins, you need to call these methods
+on the extended version of the class. To extend a parser with plugins,
+you can use its static `extend` method.
+
+```javascript
+var acorn = require("acorn");
+var jsx = require("acorn-jsx");
+var JSXParser = acorn.Parser.extend(jsx());
+JSXParser.parse("foo(<bar/>)", {ecmaVersion: 2020});
+```
+
+The `extend` method takes any number of plugin values, and returns a
+new `Parser` class that includes the extra parser logic provided by
+the plugins.
+
+## Command line interface
+
+The `bin/acorn` utility can be used to parse a file from the command
+line. It accepts as arguments its input file and the following
+options:
+
+- `--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|--ecma10`: Sets the ECMAScript version
+  to parse. Default is version 9.
+
+- `--module`: Sets the parsing mode to `"module"`. Is set to `"script"` otherwise.
+
+- `--locations`: Attaches a "loc" object to each node with "start" and
+  "end" subobjects, each of which contains the one-based line and
+  zero-based column numbers in `{line, column}` form.
+
+- `--allow-hash-bang`: If the code starts with the characters #! (as
+  in a shellscript), the first line will be treated as a comment.
+
+- `--allow-await-outside-function`: Allows top-level `await` expressions.
+  See the `allowAwaitOutsideFunction` option for more information.
+
+- `--compact`: No whitespace is used in the AST output.
+
+- `--silent`: Do not output the AST, just return the exit status.
+
+- `--help`: Print the usage information and quit.
+
+The utility spits out the syntax tree as JSON data.
+
+## Existing plugins
+
+ - [`acorn-jsx`](https://github.com/RReverser/acorn-jsx): Parse [Facebook JSX syntax extensions](https://github.com/facebook/jsx)

+ 4 - 0
node_modules/acorn/bin/acorn

@@ -0,0 +1,4 @@
+#!/usr/bin/env node
+"use strict"
+
+require("../dist/bin.js")

+ 252 - 0
node_modules/acorn/dist/acorn.d.ts

@@ -0,0 +1,252 @@
+export as namespace acorn
+export = acorn
+
+declare namespace acorn {
+  function parse(input: string, options: Options): Node
+
+  function parseExpressionAt(input: string, pos: number, options: Options): Node
+
+  function tokenizer(input: string, options: Options): {
+    getToken(): Token
+    [Symbol.iterator](): Iterator<Token>
+  }
+
+  type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 'latest'
+
+  interface Options {
+    ecmaVersion: ecmaVersion
+    sourceType?: 'script' | 'module'
+    onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
+    onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
+    allowReserved?: boolean | 'never'
+    allowReturnOutsideFunction?: boolean
+    allowImportExportEverywhere?: boolean
+    allowAwaitOutsideFunction?: boolean
+    allowSuperOutsideMethod?: boolean
+    allowHashBang?: boolean
+    locations?: boolean
+    onToken?: ((token: Token) => any) | Token[]
+    onComment?: ((
+      isBlock: boolean, text: string, start: number, end: number, startLoc?: Position,
+      endLoc?: Position
+    ) => void) | Comment[]
+    ranges?: boolean
+    program?: Node
+    sourceFile?: string
+    directSourceFile?: string
+    preserveParens?: boolean
+  }
+
+  class Parser {
+    // state.js
+    lineStart: number;
+    options: Options;
+    curLine: number;
+    start: number;
+    end: number;
+    input: string;
+    type: TokenType;
+
+    // state.js
+    constructor(options: Options, input: string, startPos?: number)
+    parse(this: Parser): Node
+
+    // tokenize.js
+    next(): void;
+    nextToken(): void;
+
+    // statement.js
+    parseTopLevel(node: Node): Node;
+
+    // node.js
+    finishNode(node: Node, type: string): Node;
+    finishNodeAt(node: Node, type: string, pos: number, loc: Position): Node;
+
+    // location.js
+    raise(pos: number, message: string) : void;
+    raiseRecoverable?(pos: number, message: string) : void;
+
+    // parseutils.js
+    unexpected(pos: number) : void;
+
+    // index.js
+    static acorn: typeof acorn;
+
+    // state.js
+    static parse(this: typeof Parser, input: string, options: Options): Node
+    static parseExpressionAt(this: typeof Parser, input: string, pos: number, options: Options): Node
+    static tokenizer(this: typeof Parser, input: string, options: Options): {
+      getToken(): Token
+      [Symbol.iterator](): Iterator<Token>
+    }
+    static extend(this: typeof Parser, ...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser
+  }
+
+  interface Position { line: number; column: number; offset: number }
+
+  const defaultOptions: Options
+
+  function getLineInfo(input: string, offset: number): Position
+
+  class SourceLocation {
+    start: Position
+    end: Position
+    source?: string | null
+    constructor(p: Parser, start: Position, end: Position)
+  }
+
+  class Node {
+    type: string
+    start: number
+    end: number
+    loc?: SourceLocation
+    sourceFile?: string
+    range?: [number, number]
+    constructor(parser: Parser, pos: number, loc?: SourceLocation)
+  }
+
+  class TokenType {
+    label: string
+    keyword: string
+    beforeExpr: boolean
+    startsExpr: boolean
+    isLoop: boolean
+    isAssign: boolean
+    prefix: boolean
+    postfix: boolean
+    binop: number
+    updateContext?: (prevType: TokenType) => void
+    constructor(label: string, conf?: any)
+  }
+
+  const tokTypes: {
+    num: TokenType
+    regexp: TokenType
+    string: TokenType
+    name: TokenType
+    privateId: TokenType
+    eof: TokenType
+    bracketL: TokenType
+    bracketR: TokenType
+    braceL: TokenType
+    braceR: TokenType
+    parenL: TokenType
+    parenR: TokenType
+    comma: TokenType
+    semi: TokenType
+    colon: TokenType
+    dot: TokenType
+    question: TokenType
+    questionDot: TokenType
+    arrow: TokenType
+    template: TokenType
+    invalidTemplate: TokenType
+    ellipsis: TokenType
+    backQuote: TokenType
+    dollarBraceL: TokenType
+    eq: TokenType
+    assign: TokenType
+    incDec: TokenType
+    prefix: TokenType
+    logicalOR: TokenType
+    logicalAND: TokenType
+    bitwiseOR: TokenType
+    bitwiseXOR: TokenType
+    bitwiseAND: TokenType
+    equality: TokenType
+    relational: TokenType
+    bitShift: TokenType
+    plusMin: TokenType
+    modulo: TokenType
+    star: TokenType
+    slash: TokenType
+    starstar: TokenType
+    coalesce: TokenType
+    _break: TokenType
+    _case: TokenType
+    _catch: TokenType
+    _continue: TokenType
+    _debugger: TokenType
+    _default: TokenType
+    _do: TokenType
+    _else: TokenType
+    _finally: TokenType
+    _for: TokenType
+    _function: TokenType
+    _if: TokenType
+    _return: TokenType
+    _switch: TokenType
+    _throw: TokenType
+    _try: TokenType
+    _var: TokenType
+    _const: TokenType
+    _while: TokenType
+    _with: TokenType
+    _new: TokenType
+    _this: TokenType
+    _super: TokenType
+    _class: TokenType
+    _extends: TokenType
+    _export: TokenType
+    _import: TokenType
+    _null: TokenType
+    _true: TokenType
+    _false: TokenType
+    _in: TokenType
+    _instanceof: TokenType
+    _typeof: TokenType
+    _void: TokenType
+    _delete: TokenType
+  }
+
+  class TokContext {
+    constructor(token: string, isExpr: boolean, preserveSpace: boolean, override?: (p: Parser) => void)
+  }
+
+  const tokContexts: {
+    b_stat: TokContext
+    b_expr: TokContext
+    b_tmpl: TokContext
+    p_stat: TokContext
+    p_expr: TokContext
+    q_tmpl: TokContext
+    f_expr: TokContext
+    f_stat: TokContext
+    f_expr_gen: TokContext
+    f_gen: TokContext
+  }
+
+  function isIdentifierStart(code: number, astral?: boolean): boolean
+
+  function isIdentifierChar(code: number, astral?: boolean): boolean
+
+  interface AbstractToken {
+  }
+
+  interface Comment extends AbstractToken {
+    type: string
+    value: string
+    start: number
+    end: number
+    loc?: SourceLocation
+    range?: [number, number]
+  }
+
+  class Token {
+    type: TokenType
+    value: any
+    start: number
+    end: number
+    loc?: SourceLocation
+    range?: [number, number]
+    constructor(p: Parser)
+  }
+
+  function isNewLine(code: number): boolean
+
+  const lineBreak: RegExp
+
+  const lineBreakG: RegExp
+
+  const version: string
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 13 - 0
node_modules/acorn/dist/acorn.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 7 - 0
node_modules/acorn/dist/acorn.mjs


+ 2 - 0
node_modules/acorn/dist/acorn.mjs.d.ts

@@ -0,0 +1,2 @@
+import * as acorn from "./acorn";
+export = acorn;

+ 91 - 0
node_modules/acorn/dist/bin.js

@@ -0,0 +1,91 @@
+'use strict';
+
+var path = require('path');
+var fs = require('fs');
+var acorn = require('./acorn.js');
+
+function _interopNamespace(e) {
+  if (e && e.__esModule) return e;
+  var n = Object.create(null);
+  if (e) {
+    Object.keys(e).forEach(function (k) {
+      if (k !== 'default') {
+        var d = Object.getOwnPropertyDescriptor(e, k);
+        Object.defineProperty(n, k, d.get ? d : {
+          enumerable: true,
+          get: function () { return e[k]; }
+        });
+      }
+    });
+  }
+  n["default"] = e;
+  return Object.freeze(n);
+}
+
+var acorn__namespace = /*#__PURE__*/_interopNamespace(acorn);
+
+var inputFilePaths = [], forceFileName = false, fileMode = false, silent = false, compact = false, tokenize = false;
+var options = {};
+
+function help(status) {
+  var print = (status === 0) ? console.log : console.error;
+  print("usage: " + path.basename(process.argv[1]) + " [--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|...|--ecma2015|--ecma2016|--ecma2017|--ecma2018|...]");
+  print("        [--tokenize] [--locations] [--allow-hash-bang] [--allow-await-outside-function] [--compact] [--silent] [--module] [--help] [--] [<infile>...]");
+  process.exit(status);
+}
+
+for (var i = 2; i < process.argv.length; ++i) {
+  var arg = process.argv[i];
+  if (arg[0] !== "-" || arg === "-") { inputFilePaths.push(arg); }
+  else if (arg === "--") {
+    inputFilePaths.push.apply(inputFilePaths, process.argv.slice(i + 1));
+    forceFileName = true;
+    break
+  } else if (arg === "--locations") { options.locations = true; }
+  else if (arg === "--allow-hash-bang") { options.allowHashBang = true; }
+  else if (arg === "--allow-await-outside-function") { options.allowAwaitOutsideFunction = true; }
+  else if (arg === "--silent") { silent = true; }
+  else if (arg === "--compact") { compact = true; }
+  else if (arg === "--help") { help(0); }
+  else if (arg === "--tokenize") { tokenize = true; }
+  else if (arg === "--module") { options.sourceType = "module"; }
+  else {
+    var match = arg.match(/^--ecma(\d+)$/);
+    if (match)
+      { options.ecmaVersion = +match[1]; }
+    else
+      { help(1); }
+  }
+}
+
+function run(codeList) {
+  var result = [], fileIdx = 0;
+  try {
+    codeList.forEach(function (code, idx) {
+      fileIdx = idx;
+      if (!tokenize) {
+        result = acorn__namespace.parse(code, options);
+        options.program = result;
+      } else {
+        var tokenizer = acorn__namespace.tokenizer(code, options), token;
+        do {
+          token = tokenizer.getToken();
+          result.push(token);
+        } while (token.type !== acorn__namespace.tokTypes.eof)
+      }
+    });
+  } catch (e) {
+    console.error(fileMode ? e.message.replace(/\(\d+:\d+\)$/, function (m) { return m.slice(0, 1) + inputFilePaths[fileIdx] + " " + m.slice(1); }) : e.message);
+    process.exit(1);
+  }
+  if (!silent) { console.log(JSON.stringify(result, null, compact ? null : 2)); }
+}
+
+if (fileMode = inputFilePaths.length && (forceFileName || !inputFilePaths.includes("-") || inputFilePaths.length !== 1)) {
+  run(inputFilePaths.map(function (path) { return fs.readFileSync(path, "utf8"); }));
+} else {
+  var code = "";
+  process.stdin.resume();
+  process.stdin.on("data", function (chunk) { return code += chunk; });
+  process.stdin.on("end", function () { return run([code]); });
+}

+ 78 - 0
node_modules/acorn/package.json

@@ -0,0 +1,78 @@
+{
+  "_from": "acorn@^8.7.0",
+  "_id": "acorn@8.8.0",
+  "_inBundle": false,
+  "_integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+  "_location": "/acorn",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "acorn@^8.7.0",
+    "name": "acorn",
+    "escapedName": "acorn",
+    "rawSpec": "^8.7.0",
+    "saveSpec": null,
+    "fetchSpec": "^8.7.0"
+  },
+  "_requiredBy": [
+    "/vm2"
+  ],
+  "_resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+  "_shasum": "88c0187620435c7f6015803f5539dae05a9dbea8",
+  "_spec": "acorn@^8.7.0",
+  "_where": "D:\\2022\\3\\Mazui\\node_modules\\vm2",
+  "bin": {
+    "acorn": "bin/acorn"
+  },
+  "bugs": {
+    "url": "https://github.com/acornjs/acorn/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "ECMAScript parser",
+  "engines": {
+    "node": ">=0.4.0"
+  },
+  "exports": {
+    ".": [
+      {
+        "import": "./dist/acorn.mjs",
+        "require": "./dist/acorn.js",
+        "default": "./dist/acorn.js"
+      },
+      "./dist/acorn.js"
+    ],
+    "./package.json": "./package.json"
+  },
+  "homepage": "https://github.com/acornjs/acorn",
+  "license": "MIT",
+  "main": "dist/acorn.js",
+  "maintainers": [
+    {
+      "name": "Marijn Haverbeke",
+      "email": "marijnh@gmail.com",
+      "url": "https://marijnhaverbeke.nl"
+    },
+    {
+      "name": "Ingvar Stepanyan",
+      "email": "me@rreverser.com",
+      "url": "https://rreverser.com/"
+    },
+    {
+      "name": "Adrian Heine",
+      "url": "http://adrianheine.de"
+    }
+  ],
+  "module": "dist/acorn.mjs",
+  "name": "acorn",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/acornjs/acorn.git"
+  },
+  "scripts": {
+    "prepare": "cd ..; npm run build:main"
+  },
+  "types": "dist/acorn.d.ts",
+  "version": "8.8.0"
+}

+ 74 - 0
node_modules/address/History.md

@@ -0,0 +1,74 @@
+
+1.2.1 / 2022-09-13
+==================
+
+**fixes**
+  * [[`c316a04`](http://github.com/node-modules/address/commit/c316a044aedeadf438c2c2a7278d51f0861df8af)] - fix: local addresses should be ignored on interface (#32) (Jon Kelley <<jkelleyrtp@gmail.com>>)
+
+**others**
+  * [[`823b70c`](http://github.com/node-modules/address/commit/823b70c2f53ab96d6e25041aa444436d906c59ef)] - 🤖 TEST: Run test on GitHub action (#27) (fengmk2 <<fengmk2@gmail.com>>)
+  * [[`2b5fb44`](http://github.com/node-modules/address/commit/2b5fb44ca1ff1a0d64768e8d42845ec377b9e3f8)] - Create codeql-analysis.yml (fengmk2 <<fengmk2@gmail.com>>)
+
+1.2.0 / 2022-04-29
+==================
+
+**features**
+  * [[`fe81a41`](http://github.com/node-modules/address/commit/fe81a415403ba46d7bc09d76a2f9fc46bc2fc803)] - feat: address.ip() supports node 18 (#26) (Yuheng Zhang <<zhangyuheng91@gmail.com>>)
+
+1.1.2 / 2019-08-26
+==================
+
+**fixes**
+  * [[`304754e`](http://github.com/node-modules/address/commit/304754ea4ef0dd34db7ba34745f4f4543afc064c)] - fix: fix declarations (#20) (吖猩 <<whxaxes@qq.com>>)
+
+1.1.1 / 2019-08-22
+==================
+
+**fixes**
+  * [[`19884ff`](http://github.com/node-modules/address/commit/19884ffbe9ad75f9a66889a031db4b806da1f822)] - fix: update d.ts (#18) (MarioDu <<dujiakun@gmail.com>>)
+
+1.1.0 / 2019-04-24
+==================
+
+**features**
+  * [[`7544592`](http://github.com/node-modules/address/commit/75445923a6f737fc21e3cf592f749bf014b7b4ce)] - feat: Add typings (#15) (Mathieu TUDISCO <<oss@mathieutu.dev>>)
+
+1.0.3 / 2017-08-24
+==================
+
+**fixes**
+  * [[`ed491c5`](http://github.com/node-modules/address/commit/ed491c5bd353118e4e4d384f47f13c3e1cfeb80e)] - fix: ignore wrong mac address on node 8.x (#10) (fengmk2 <<fengmk2@gmail.com>>)
+
+1.0.2 / 2017-05-26
+==================
+
+  * fix: win32 get mac failed (#9)
+
+1.0.1 / 2016-09-30
+==================
+
+  * test: remove 0.12
+  * fix: search interface before family match
+  * add contributors
+
+1.0.0 / 2015-08-06
+==================
+
+ * chore: use npm scripts instead of Makefile
+ * add benchmark
+
+0.0.3 / 2013-11-04 
+==================
+
+  * get the first not local ip when interface not exists
+
+0.0.2 / 2013-08-08 
+==================
+
+  * use networkInterface() to get mac fix #3
+
+0.0.1 / 2013-07-31 
+==================
+
+  * ip(), ipv6(), mac(), dns() work on osx and linux now.
+  * first commit

+ 22 - 0
node_modules/address/LICENSE.txt

@@ -0,0 +1,22 @@
+This software is licensed under the MIT License.
+
+Copyright (C) 2013 - 2014 fengmk2 <fengmk2@gmail.com>
+Copyright (C) 2015 - present node-modules and other contributors.
+
+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, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 93 - 0
node_modules/address/README.md

@@ -0,0 +1,93 @@
+address
+=======
+
+[![NPM version][npm-image]][npm-url]
+[![Node.js CI](https://github.com/node-modules/address/actions/workflows/nodejs.yml/badge.svg)](https://github.com/node-modules/address/actions/workflows/nodejs.yml)
+[![Test coverage][coveralls-image]][coveralls-url]
+[![npm download][download-image]][download-url]
+
+[npm-image]: https://img.shields.io/npm/v/address.svg?style=flat-square
+[npm-url]: https://npmjs.org/package/address
+[coveralls-image]: https://img.shields.io/coveralls/node-modules/address.svg?style=flat-square
+[coveralls-url]: https://coveralls.io/r/node-modules/address?branch=master
+[download-image]: https://img.shields.io/npm/dm/address.svg?style=flat-square
+[download-url]: https://npmjs.org/package/address
+
+Get current machine IP, MAC and DNS servers.
+
+DNS servers receive from `/etc/resolv.conf`.
+
+## Install
+
+```bash
+$ npm install address
+```
+
+## Usage
+
+Get IP is sync and get MAC is async for now.
+
+```js
+const address = require('address');
+
+// default interface 'eth' on linux, 'en' on osx.
+address.ip();   // '192.168.0.2'
+address.ipv6(); // 'fe80::7aca:39ff:feb0:e67d'
+address.mac(function (err, addr) {
+  console.log(addr); // '78:ca:39:b0:e6:7d'
+});
+
+// local loopback
+address.ip('lo'); // '127.0.0.1'
+
+// vboxnet MAC
+address.mac('vboxnet', function (err, addr) {
+  console.log(addr); // '0a:00:27:00:00:00'
+});
+```
+
+### Get all addresses: IPv4, IPv6 and MAC
+
+```js
+address((err, addrs) => {
+  console.log(addrs.ip, addrs.ipv6, addrs.mac);
+  // '192.168.0.2', 'fe80::7aca:39ff:feb0:e67d', '78:ca:39:b0:e6:7d'
+});
+
+address('vboxnet', (err, addrs) => {
+  console.log(addrs.ip, addrs.ipv6, addrs.mac);
+  // '192.168.56.1', null, '0a:00:27:00:00:00'
+});
+```
+
+### Get an interface info with family
+
+```js
+address.interface('IPv4', 'eth1');
+// { address: '192.168.1.1', family: 'IPv4', mac: '78:ca:39:b0:e6:7d' }
+```
+
+### Get DNS servers
+
+```js
+address.dns((err, addrs) => {
+  console.log(addrs);
+  // ['10.13.2.1', '10.13.2.6']
+});
+```
+
+## License
+
+[MIT](LICENSE.txt)
+
+<!-- GITCONTRIBUTOR_START -->
+
+## Contributors
+
+|[<img src="https://avatars.githubusercontent.com/u/156269?v=4" width="100px;"/><br/><sub><b>fengmk2</b></sub>](https://github.com/fengmk2)<br/>|[<img src="https://avatars.githubusercontent.com/u/1147375?v=4" width="100px;"/><br/><sub><b>alsotang</b></sub>](https://github.com/alsotang)<br/>|[<img src="https://avatars.githubusercontent.com/u/10237910?v=4" width="100px;"/><br/><sub><b>jkelleyrtp</b></sub>](https://github.com/jkelleyrtp)<br/>|[<img src="https://avatars.githubusercontent.com/u/1409643?v=4" width="100px;"/><br/><sub><b>mariodu</b></sub>](https://github.com/mariodu)<br/>|[<img src="https://avatars.githubusercontent.com/u/11351322?v=4" width="100px;"/><br/><sub><b>mathieutu</b></sub>](https://github.com/mathieutu)<br/>|[<img src="https://avatars.githubusercontent.com/u/2139038?v=4" width="100px;"/><br/><sub><b>zhangyuheng</b></sub>](https://github.com/zhangyuheng)<br/>|
+| :---: | :---: | :---: | :---: | :---: | :---: |
+[<img src="https://avatars.githubusercontent.com/u/1400114?v=4" width="100px;"/><br/><sub><b>coolme200</b></sub>](https://github.com/coolme200)<br/>|[<img src="https://avatars.githubusercontent.com/u/5856440?v=4" width="100px;"/><br/><sub><b>whxaxes</b></sub>](https://github.com/whxaxes)<br/>
+
+This project follows the git-contributor [spec](https://github.com/xudafeng/git-contributor), auto updated at `Tue Sep 13 2022 09:09:11 GMT+0800`.
+
+<!-- GITCONTRIBUTOR_END -->

+ 28 - 0
node_modules/address/lib/address.d.ts

@@ -0,0 +1,28 @@
+export = address;
+
+declare interface Address {
+  ip: string;
+  ipv6: string;
+  mac: string;
+}
+
+declare type AddressCallback = (err: Error, addr: Address) => void;
+declare type MacCallback = (err: Error, addr: string) => void;
+declare type DnsCallback = (err: Error, servers: string[]) => void;
+
+declare function address(interfaceName: string, callback: AddressCallback): void;
+declare function address(callback: AddressCallback): void;
+
+declare namespace address {
+  const MAC_IP_RE: RegExp;
+  const MAC_RE: RegExp;
+
+  function dns(filepath: string, callback: DnsCallback): void;
+  function dns(callback: DnsCallback): void;
+
+  function ip(interfaceName?: string): any;
+  function ipv6(interfaceName?: string): any;
+
+  function mac(interfaceName: string, callback: MacCallback): void;
+  function mac(callback: MacCallback): void;
+}

+ 263 - 0
node_modules/address/lib/address.js

@@ -0,0 +1,263 @@
+'use strict';
+
+var os = require('os');
+var fs = require('fs');
+var child = require('child_process');
+
+var DEFAULT_RESOLV_FILE = '/etc/resolv.conf';
+
+function getInterfaceName() {
+  var val = 'eth';
+  var platform = os.platform();
+  if (platform === 'darwin') {
+    val = 'en';
+  } else if (platform === 'win32') {
+    val = null;
+  }
+  return val;
+}
+
+function getIfconfigCMD() {
+  if (os.platform() === 'win32') {
+    return 'ipconfig/all';
+  }
+  return '/sbin/ifconfig';
+}
+
+// typeof os.networkInterfaces family is a number (v18.0.0)
+// types: 'IPv4' | 'IPv6' => 4 | 6
+// @see https://github.com/nodejs/node/issues/42861
+function matchName(actualFamily, expectedFamily) {
+  if (expectedFamily === 'IPv4') {
+    return actualFamily === 'IPv4' || actualFamily === 4;
+  }
+  if (expectedFamily === 'IPv6') {
+    return actualFamily === 'IPv6' || actualFamily === 6;
+  }
+  return actualFamily === expectedFamily;
+}
+
+/**
+ * Get all addresses.
+ *
+ * @param {String} [interfaceName] interface name, default is 'eth' on linux, 'en' on mac os.
+ * @param {Function(err, addr)} callback
+ *  - {Object} addr {
+ *    - {String} ip
+ *    - {String} ipv6
+ *    - {String} mac
+ *  }
+ */
+function address(interfaceName, callback) {
+  if (typeof interfaceName === 'function') {
+    callback = interfaceName;
+    interfaceName = null;
+  }
+
+  var addr = {
+    ip: address.ip(interfaceName),
+    ipv6: address.ipv6(interfaceName),
+    mac: null
+  };
+  address.mac(interfaceName, function (err, mac) {
+    if (mac) {
+      addr.mac = mac;
+    }
+    callback(err, addr);
+  });
+}
+
+address.interface = function (family, name) {
+  var interfaces = os.networkInterfaces();
+  var noName = !name;
+  name = name || getInterfaceName();
+  family = family || 'IPv4';
+  for (var i = -1; i < 8; i++) {
+    var interfaceName = name + (i >= 0 ? i : ''); // support 'lo' and 'lo0'
+    var items = interfaces[interfaceName];
+    if (items) {
+      for (var j = 0; j < items.length; j++) {
+        var item = items[j];
+        if (matchName(item.family, family)) {
+          return item;
+        }
+      }
+    }
+  }
+
+  if (noName) {
+    // filter all loopback or local addresses
+    for (var k in interfaces) {
+      var items = interfaces[k];
+      for (var i = 0; i < items.length; i++) {
+        var item = items[i];
+        // all 127 addresses are local and should be ignored
+        if (matchName(item.family, family) && !item.address.startsWith('127.')) {
+          return item;
+        }
+      }
+    }
+  }
+  return;
+};
+
+/**
+ * Get current machine IPv4
+ *
+ * @param {String} [interfaceName] interface name, default is 'eth' on linux, 'en' on mac os.
+ * @return {String} IP address
+ */
+address.ip = function (interfaceName) {
+  var item = address.interface('IPv4', interfaceName);
+  return item && item.address;
+};
+
+/**
+ * Get current machine IPv6
+ *
+ * @param {String} [interfaceName] interface name, default is 'eth' on linux, 'en' on mac os.
+ * @return {String} IP address
+ */
+address.ipv6 = function (interfaceName) {
+  var item = address.interface('IPv6', interfaceName);
+  return item && item.address;
+};
+
+// osx start line 'en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500'
+// linux start line 'eth0      Link encap:Ethernet  HWaddr 00:16:3E:00:0A:29  '
+var MAC_OSX_START_LINE = /^(\w+)\:\s+flags=/;
+var MAC_LINUX_START_LINE = /^(\w+)\s{2,}link encap:\w+/i;
+
+// ether 78:ca:39:b0:e6:7d
+// HWaddr 00:16:3E:00:0A:29
+var MAC_RE = address.MAC_RE = /(?:ether|HWaddr)\s+((?:[a-z0-9]{2}\:){5}[a-z0-9]{2})/i;
+
+// osx: inet 192.168.2.104 netmask 0xffffff00 broadcast 192.168.2.255
+// linux: inet addr:10.125.5.202  Bcast:10.125.15.255  Mask:255.255.240.0
+var MAC_IP_RE = address.MAC_IP_RE = /inet\s(?:addr\:)?(\d+\.\d+\.\d+\.\d+)/;
+
+function getMAC(content, interfaceName, matchIP) {
+  var lines = content.split('\n');
+  for (var i = 0; i < lines.length; i++) {
+    var line = lines[i].trimRight();
+    var m = MAC_OSX_START_LINE.exec(line) || MAC_LINUX_START_LINE.exec(line);
+    if (!m) {
+      continue;
+    }
+
+    // check interface name
+    var name = m[1];
+    if (name.indexOf(interfaceName) !== 0) {
+      continue;
+    }
+
+    var ip = null;
+    var mac = null;
+    var match = MAC_RE.exec(line);
+    if (match) {
+      mac = match[1];
+    }
+
+    i++;
+    while (true) {
+      line = lines[i];
+      if (!line || MAC_OSX_START_LINE.exec(line) || MAC_LINUX_START_LINE.exec(line)) {
+        i--;
+        break; // hit next interface, handle next interface
+      }
+      if (!mac) {
+        match = MAC_RE.exec(line);
+        if (match) {
+          mac = match[1];
+        }
+      }
+
+      if (!ip) {
+        match = MAC_IP_RE.exec(line);
+        if (match) {
+          ip = match[1];
+        }
+      }
+
+      i++;
+    }
+
+    if (ip === matchIP) {
+      return mac;
+    }
+  }
+}
+
+/**
+ * Get current machine MAC address
+ *
+ * @param {String} [interfaceName] interface name, default is 'eth' on linux, 'en' on mac os.
+ * @param {Function(err, address)} callback
+ */
+address.mac = function (interfaceName, callback) {
+  if (typeof interfaceName === 'function') {
+    callback = interfaceName;
+    interfaceName = null;
+  }
+  interfaceName = interfaceName || getInterfaceName();
+  var item = address.interface('IPv4', interfaceName);
+  if (!item) {
+    return callback();
+  }
+
+  // https://github.com/nodejs/node/issues/13581
+  // bug in node 7.x and <= 8.4.0
+  if (!process.env.CI && (item.mac === 'ff:00:00:00:00:00' || item.mac === '00:00:00:00:00:00')) {
+    // wrong address, ignore it
+    item.mac = '';
+  }
+
+  if (item.mac) {
+    return callback(null, item.mac);
+  }
+
+  child.exec(getIfconfigCMD(), {timeout: 5000}, function (err, stdout, stderr) {
+    if (err || !stdout) {
+      return callback(err);
+    }
+
+    var mac = getMAC(stdout || '', interfaceName, item.address);
+    callback(null, mac);
+  });
+};
+
+// nameserver 172.24.102.254
+var DNS_SERVER_RE = /^nameserver\s+(\d+\.\d+\.\d+\.\d+)$/i;
+
+/**
+ * Get DNS servers.
+ *
+ * @param {String} [filepath] resolv config file path. default is '/etc/resolv.conf'.
+ * @param {Function(err, servers)} callback
+ */
+address.dns = function (filepath, callback) {
+  if (typeof filepath === 'function') {
+    callback = filepath;
+    filepath = null;
+  }
+  filepath = filepath || DEFAULT_RESOLV_FILE;
+  fs.readFile(filepath, 'utf8', function (err, content) {
+    if (err) {
+      return callback(err);
+    }
+    var servers = [];
+    content = content || '';
+    var lines = content.split('\n');
+    for (var i = 0; i < lines.length; i++) {
+      var line = lines[i].trim();
+      var m = DNS_SERVER_RE.exec(line);
+      if (m) {
+        servers.push(m[1]);
+      }
+    }
+
+    callback(null, servers);
+  });
+};
+
+module.exports = address;

+ 78 - 0
node_modules/address/package.json

@@ -0,0 +1,78 @@
+{
+  "_from": "address@^1.0.0",
+  "_id": "address@1.2.1",
+  "_inBundle": false,
+  "_integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==",
+  "_location": "/address",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "address@^1.0.0",
+    "name": "address",
+    "escapedName": "address",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/ali-oss",
+    "/digest-header/utility"
+  ],
+  "_resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz",
+  "_shasum": "25bb61095b7522d65b357baa11bc05492d4c8acd",
+  "_spec": "address@^1.0.0",
+  "_where": "D:\\2022\\3\\Mazui\\node_modules\\ali-oss",
+  "author": {
+    "name": "fengmk2",
+    "email": "fengmk2@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/node-modules/address/issues"
+  },
+  "bundleDependencies": false,
+  "ci": {
+    "version": "14, 16, 18",
+    "type": "github",
+    "os": "linux, macos"
+  },
+  "dependencies": {},
+  "deprecated": false,
+  "description": "Get current machine IP, MAC and DNS servers.",
+  "devDependencies": {
+    "@types/node": "^12.7.2",
+    "egg-bin": "^4.19.0",
+    "egg-ci": "^2.1.0",
+    "git-contributor": "^1.1.0",
+    "mm": "*",
+    "runscript": "^1.4.0",
+    "typescript": "^3.5.3"
+  },
+  "engines": {
+    "node": ">= 10.0.0"
+  },
+  "files": [
+    "lib"
+  ],
+  "homepage": "https://github.com/node-modules/address#readme",
+  "keywords": [
+    "address",
+    "ip",
+    "ipv4",
+    "mac"
+  ],
+  "license": "MIT",
+  "main": "lib/address.js",
+  "name": "address",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/node-modules/address.git"
+  },
+  "scripts": {
+    "ci": "egg-bin cov",
+    "contributors": "git-contributor",
+    "test": "egg-bin test"
+  },
+  "types": "lib/address.d.ts",
+  "version": "1.2.1"
+}

+ 145 - 0
node_modules/agent-base/README.md

@@ -0,0 +1,145 @@
+agent-base
+==========
+### Turn a function into an [`http.Agent`][http.Agent] instance
+[![Build Status](https://github.com/TooTallNate/node-agent-base/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-agent-base/actions?workflow=Node+CI)
+
+This module provides an `http.Agent` generator. That is, you pass it an async
+callback function, and it returns a new `http.Agent` instance that will invoke the
+given callback function when sending outbound HTTP requests.
+
+#### Some subclasses:
+
+Here's some more interesting uses of `agent-base`.
+Send a pull request to list yours!
+
+ * [`http-proxy-agent`][http-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTP endpoints
+ * [`https-proxy-agent`][https-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTPS endpoints
+ * [`pac-proxy-agent`][pac-proxy-agent]: A PAC file proxy `http.Agent` implementation for HTTP and HTTPS
+ * [`socks-proxy-agent`][socks-proxy-agent]: A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS
+
+
+Installation
+------------
+
+Install with `npm`:
+
+``` bash
+$ npm install agent-base
+```
+
+
+Example
+-------
+
+Here's a minimal example that creates a new `net.Socket` connection to the server
+for every HTTP request (i.e. the equivalent of `agent: false` option):
+
+```js
+var net = require('net');
+var tls = require('tls');
+var url = require('url');
+var http = require('http');
+var agent = require('agent-base');
+
+var endpoint = 'http://nodejs.org/api/';
+var parsed = url.parse(endpoint);
+
+// This is the important part!
+parsed.agent = agent(function (req, opts) {
+  var socket;
+  // `secureEndpoint` is true when using the https module
+  if (opts.secureEndpoint) {
+    socket = tls.connect(opts);
+  } else {
+    socket = net.connect(opts);
+  }
+  return socket;
+});
+
+// Everything else works just like normal...
+http.get(parsed, function (res) {
+  console.log('"response" event!', res.headers);
+  res.pipe(process.stdout);
+});
+```
+
+Returning a Promise or using an `async` function is also supported:
+
+```js
+agent(async function (req, opts) {
+  await sleep(1000);
+  // etc…
+});
+```
+
+Return another `http.Agent` instance to "pass through" the responsibility
+for that HTTP request to that agent:
+
+```js
+agent(function (req, opts) {
+  return opts.secureEndpoint ? https.globalAgent : http.globalAgent;
+});
+```
+
+
+API
+---
+
+## Agent(Function callback[, Object options]) → [http.Agent][]
+
+Creates a base `http.Agent` that will execute the callback function `callback`
+for every HTTP request that it is used as the `agent` for. The callback function
+is responsible for creating a `stream.Duplex` instance of some kind that will be
+used as the underlying socket in the HTTP request.
+
+The `options` object accepts the following properties:
+
+  * `timeout` - Number - Timeout for the `callback()` function in milliseconds. Defaults to Infinity (optional).
+
+The callback function should have the following signature:
+
+### callback(http.ClientRequest req, Object options, Function cb) → undefined
+
+The ClientRequest `req` can be accessed to read request headers and
+and the path, etc. The `options` object contains the options passed
+to the `http.request()`/`https.request()` function call, and is formatted
+to be directly passed to `net.connect()`/`tls.connect()`, or however
+else you want a Socket to be created. Pass the created socket to
+the callback function `cb` once created, and the HTTP request will
+continue to proceed.
+
+If the `https` module is used to invoke the HTTP request, then the
+`secureEndpoint` property on `options` _will be set to `true`_.
+
+
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2013 Nathan Rajlich &lt;nathan@tootallnate.net&gt;
+
+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, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+[http-proxy-agent]: https://github.com/TooTallNate/node-http-proxy-agent
+[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent
+[pac-proxy-agent]: https://github.com/TooTallNate/node-pac-proxy-agent
+[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent
+[http.Agent]: https://nodejs.org/api/http.html#http_class_http_agent

+ 78 - 0
node_modules/agent-base/dist/src/index.d.ts

@@ -0,0 +1,78 @@
+/// <reference types="node" />
+import net from 'net';
+import http from 'http';
+import https from 'https';
+import { Duplex } from 'stream';
+import { EventEmitter } from 'events';
+declare function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent;
+declare function createAgent(callback: createAgent.AgentCallback, opts?: createAgent.AgentOptions): createAgent.Agent;
+declare namespace createAgent {
+    interface ClientRequest extends http.ClientRequest {
+        _last?: boolean;
+        _hadError?: boolean;
+        method: string;
+    }
+    interface AgentRequestOptions {
+        host?: string;
+        path?: string;
+        port: number;
+    }
+    interface HttpRequestOptions extends AgentRequestOptions, Omit<http.RequestOptions, keyof AgentRequestOptions> {
+        secureEndpoint: false;
+    }
+    interface HttpsRequestOptions extends AgentRequestOptions, Omit<https.RequestOptions, keyof AgentRequestOptions> {
+        secureEndpoint: true;
+    }
+    type RequestOptions = HttpRequestOptions | HttpsRequestOptions;
+    type AgentLike = Pick<createAgent.Agent, 'addRequest'> | http.Agent;
+    type AgentCallbackReturn = Duplex | AgentLike;
+    type AgentCallbackCallback = (err?: Error | null, socket?: createAgent.AgentCallbackReturn) => void;
+    type AgentCallbackPromise = (req: createAgent.ClientRequest, opts: createAgent.RequestOptions) => createAgent.AgentCallbackReturn | Promise<createAgent.AgentCallbackReturn>;
+    type AgentCallback = typeof Agent.prototype.callback;
+    type AgentOptions = {
+        timeout?: number;
+    };
+    /**
+     * Base `http.Agent` implementation.
+     * No pooling/keep-alive is implemented by default.
+     *
+     * @param {Function} callback
+     * @api public
+     */
+    class Agent extends EventEmitter {
+        timeout: number | null;
+        maxFreeSockets: number;
+        maxTotalSockets: number;
+        maxSockets: number;
+        sockets: {
+            [key: string]: net.Socket[];
+        };
+        freeSockets: {
+            [key: string]: net.Socket[];
+        };
+        requests: {
+            [key: string]: http.IncomingMessage[];
+        };
+        options: https.AgentOptions;
+        private promisifiedCallback?;
+        private explicitDefaultPort?;
+        private explicitProtocol?;
+        constructor(callback?: createAgent.AgentCallback | createAgent.AgentOptions, _opts?: createAgent.AgentOptions);
+        get defaultPort(): number;
+        set defaultPort(v: number);
+        get protocol(): string;
+        set protocol(v: string);
+        callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions, fn: createAgent.AgentCallbackCallback): void;
+        callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions): createAgent.AgentCallbackReturn | Promise<createAgent.AgentCallbackReturn>;
+        /**
+         * Called by node-core's "_http_client.js" module when creating
+         * a new HTTP request with this Agent instance.
+         *
+         * @api public
+         */
+        addRequest(req: ClientRequest, _opts: RequestOptions): void;
+        freeSocket(socket: net.Socket, opts: AgentOptions): void;
+        destroy(): void;
+    }
+}
+export = createAgent;

+ 203 - 0
node_modules/agent-base/dist/src/index.js

@@ -0,0 +1,203 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+const events_1 = require("events");
+const debug_1 = __importDefault(require("debug"));
+const promisify_1 = __importDefault(require("./promisify"));
+const debug = debug_1.default('agent-base');
+function isAgent(v) {
+    return Boolean(v) && typeof v.addRequest === 'function';
+}
+function isSecureEndpoint() {
+    const { stack } = new Error();
+    if (typeof stack !== 'string')
+        return false;
+    return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1 || l.indexOf('node:https:') !== -1);
+}
+function createAgent(callback, opts) {
+    return new createAgent.Agent(callback, opts);
+}
+(function (createAgent) {
+    /**
+     * Base `http.Agent` implementation.
+     * No pooling/keep-alive is implemented by default.
+     *
+     * @param {Function} callback
+     * @api public
+     */
+    class Agent extends events_1.EventEmitter {
+        constructor(callback, _opts) {
+            super();
+            let opts = _opts;
+            if (typeof callback === 'function') {
+                this.callback = callback;
+            }
+            else if (callback) {
+                opts = callback;
+            }
+            // Timeout for the socket to be returned from the callback
+            this.timeout = null;
+            if (opts && typeof opts.timeout === 'number') {
+                this.timeout = opts.timeout;
+            }
+            // These aren't actually used by `agent-base`, but are required
+            // for the TypeScript definition files in `@types/node` :/
+            this.maxFreeSockets = 1;
+            this.maxSockets = 1;
+            this.maxTotalSockets = Infinity;
+            this.sockets = {};
+            this.freeSockets = {};
+            this.requests = {};
+            this.options = {};
+        }
+        get defaultPort() {
+            if (typeof this.explicitDefaultPort === 'number') {
+                return this.explicitDefaultPort;
+            }
+            return isSecureEndpoint() ? 443 : 80;
+        }
+        set defaultPort(v) {
+            this.explicitDefaultPort = v;
+        }
+        get protocol() {
+            if (typeof this.explicitProtocol === 'string') {
+                return this.explicitProtocol;
+            }
+            return isSecureEndpoint() ? 'https:' : 'http:';
+        }
+        set protocol(v) {
+            this.explicitProtocol = v;
+        }
+        callback(req, opts, fn) {
+            throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`');
+        }
+        /**
+         * Called by node-core's "_http_client.js" module when creating
+         * a new HTTP request with this Agent instance.
+         *
+         * @api public
+         */
+        addRequest(req, _opts) {
+            const opts = Object.assign({}, _opts);
+            if (typeof opts.secureEndpoint !== 'boolean') {
+                opts.secureEndpoint = isSecureEndpoint();
+            }
+            if (opts.host == null) {
+                opts.host = 'localhost';
+            }
+            if (opts.port == null) {
+                opts.port = opts.secureEndpoint ? 443 : 80;
+            }
+            if (opts.protocol == null) {
+                opts.protocol = opts.secureEndpoint ? 'https:' : 'http:';
+            }
+            if (opts.host && opts.path) {
+                // If both a `host` and `path` are specified then it's most
+                // likely the result of a `url.parse()` call... we need to
+                // remove the `path` portion so that `net.connect()` doesn't
+                // attempt to open that as a unix socket file.
+                delete opts.path;
+            }
+            delete opts.agent;
+            delete opts.hostname;
+            delete opts._defaultAgent;
+            delete opts.defaultPort;
+            delete opts.createConnection;
+            // Hint to use "Connection: close"
+            // XXX: non-documented `http` module API :(
+            req._last = true;
+            req.shouldKeepAlive = false;
+            let timedOut = false;
+            let timeoutId = null;
+            const timeoutMs = opts.timeout || this.timeout;
+            const onerror = (err) => {
+                if (req._hadError)
+                    return;
+                req.emit('error', err);
+                // For Safety. Some additional errors might fire later on
+                // and we need to make sure we don't double-fire the error event.
+                req._hadError = true;
+            };
+            const ontimeout = () => {
+                timeoutId = null;
+                timedOut = true;
+                const err = new Error(`A "socket" was not created for HTTP request before ${timeoutMs}ms`);
+                err.code = 'ETIMEOUT';
+                onerror(err);
+            };
+            const callbackError = (err) => {
+                if (timedOut)
+                    return;
+                if (timeoutId !== null) {
+                    clearTimeout(timeoutId);
+                    timeoutId = null;
+                }
+                onerror(err);
+            };
+            const onsocket = (socket) => {
+                if (timedOut)
+                    return;
+                if (timeoutId != null) {
+                    clearTimeout(timeoutId);
+                    timeoutId = null;
+                }
+                if (isAgent(socket)) {
+                    // `socket` is actually an `http.Agent` instance, so
+                    // relinquish responsibility for this `req` to the Agent
+                    // from here on
+                    debug('Callback returned another Agent instance %o', socket.constructor.name);
+                    socket.addRequest(req, opts);
+                    return;
+                }
+                if (socket) {
+                    socket.once('free', () => {
+                        this.freeSocket(socket, opts);
+                    });
+                    req.onSocket(socket);
+                    return;
+                }
+                const err = new Error(`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``);
+                onerror(err);
+            };
+            if (typeof this.callback !== 'function') {
+                onerror(new Error('`callback` is not defined'));
+                return;
+            }
+            if (!this.promisifiedCallback) {
+                if (this.callback.length >= 3) {
+                    debug('Converting legacy callback function to promise');
+                    this.promisifiedCallback = promisify_1.default(this.callback);
+                }
+                else {
+                    this.promisifiedCallback = this.callback;
+                }
+            }
+            if (typeof timeoutMs === 'number' && timeoutMs > 0) {
+                timeoutId = setTimeout(ontimeout, timeoutMs);
+            }
+            if ('port' in opts && typeof opts.port !== 'number') {
+                opts.port = Number(opts.port);
+            }
+            try {
+                debug('Resolving socket for %o request: %o', opts.protocol, `${req.method} ${req.path}`);
+                Promise.resolve(this.promisifiedCallback(req, opts)).then(onsocket, callbackError);
+            }
+            catch (err) {
+                Promise.reject(err).catch(callbackError);
+            }
+        }
+        freeSocket(socket, opts) {
+            debug('Freeing socket %o %o', socket.constructor.name, opts);
+            socket.destroy();
+        }
+        destroy() {
+            debug('Destroying agent %o', this.constructor.name);
+        }
+    }
+    createAgent.Agent = Agent;
+    // So that `instanceof` works correctly
+    createAgent.prototype = createAgent.Agent.prototype;
+})(createAgent || (createAgent = {}));
+module.exports = createAgent;
+//# sourceMappingURL=index.js.map

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
node_modules/agent-base/dist/src/index.js.map


+ 4 - 0
node_modules/agent-base/dist/src/promisify.d.ts

@@ -0,0 +1,4 @@
+import { ClientRequest, RequestOptions, AgentCallbackCallback, AgentCallbackPromise } from './index';
+declare type LegacyCallback = (req: ClientRequest, opts: RequestOptions, fn: AgentCallbackCallback) => void;
+export default function promisify(fn: LegacyCallback): AgentCallbackPromise;
+export {};

+ 18 - 0
node_modules/agent-base/dist/src/promisify.js

@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function promisify(fn) {
+    return function (req, opts) {
+        return new Promise((resolve, reject) => {
+            fn.call(this, req, opts, (err, rtn) => {
+                if (err) {
+                    reject(err);
+                }
+                else {
+                    resolve(rtn);
+                }
+            });
+        });
+    };
+}
+exports.default = promisify;
+//# sourceMappingURL=promisify.js.map

+ 1 - 0
node_modules/agent-base/dist/src/promisify.js.map

@@ -0,0 +1 @@
+{"version":3,"file":"promisify.js","sourceRoot":"","sources":["../../src/promisify.ts"],"names":[],"mappings":";;AAeA,SAAwB,SAAS,CAAC,EAAkB;IACnD,OAAO,UAAsB,GAAkB,EAAE,IAAoB;QACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,EAAE,CAAC,IAAI,CACN,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,CAAC,GAA6B,EAAE,GAAyB,EAAE,EAAE;gBAC5D,IAAI,GAAG,EAAE;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;iBACZ;qBAAM;oBACN,OAAO,CAAC,GAAG,CAAC,CAAC;iBACb;YACF,CAAC,CACD,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AAjBD,4BAiBC"}

+ 20 - 0
node_modules/agent-base/node_modules/debug/LICENSE

@@ -0,0 +1,20 @@
+(The MIT License)
+
+Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>
+Copyright (c) 2018-2021 Josh Junon
+
+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,
+including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial
+portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+

+ 481 - 0
node_modules/agent-base/node_modules/debug/README.md

@@ -0,0 +1,481 @@
+# debug
+[![Build Status](https://travis-ci.org/debug-js/debug.svg?branch=master)](https://travis-ci.org/debug-js/debug)  [![Coverage Status](https://coveralls.io/repos/github/debug-js/debug/badge.svg?branch=master)](https://coveralls.io/github/debug-js/debug?branch=master)  [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers)
+[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
+
+<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
+
+A tiny JavaScript debugging utility modelled after Node.js core's debugging
+technique. Works in Node.js and web browsers.
+
+## Installation
+
+```bash
+$ npm install debug
+```
+
+## Usage
+
+`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
+
+Example [_app.js_](./examples/node/app.js):
+
+```js
+var debug = require('debug')('http')
+  , http = require('http')
+  , name = 'My App';
+
+// fake app
+
+debug('booting %o', name);
+
+http.createServer(function(req, res){
+  debug(req.method + ' ' + req.url);
+  res.end('hello\n');
+}).listen(3000, function(){
+  debug('listening');
+});
+
+// fake worker of some kind
+
+require('./worker');
+```
+
+Example [_worker.js_](./examples/node/worker.js):
+
+```js
+var a = require('debug')('worker:a')
+  , b = require('debug')('worker:b');
+
+function work() {
+  a('doing lots of uninteresting work');
+  setTimeout(work, Math.random() * 1000);
+}
+
+work();
+
+function workb() {
+  b('doing some work');
+  setTimeout(workb, Math.random() * 2000);
+}
+
+workb();
+```
+
+The `DEBUG` environment variable is then used to enable these based on space or
+comma-delimited names.
+
+Here are some examples:
+
+<img width="647" alt="screen shot 2017-08-08 at 12 53 04 pm" src="https://user-images.githubusercontent.com/71256/29091703-a6302cdc-7c38-11e7-8304-7c0b3bc600cd.png">
+<img width="647" alt="screen shot 2017-08-08 at 12 53 38 pm" src="https://user-images.githubusercontent.com/71256/29091700-a62a6888-7c38-11e7-800b-db911291ca2b.png">
+<img width="647" alt="screen shot 2017-08-08 at 12 53 25 pm" src="https://user-images.githubusercontent.com/71256/29091701-a62ea114-7c38-11e7-826a-2692bedca740.png">
+
+#### Windows command prompt notes
+
+##### CMD
+
+On Windows the environment variable is set using the `set` command.
+
+```cmd
+set DEBUG=*,-not_this
+```
+
+Example:
+
+```cmd
+set DEBUG=* & node app.js
+```
+
+##### PowerShell (VS Code default)
+
+PowerShell uses different syntax to set environment variables.
+
+```cmd
+$env:DEBUG = "*,-not_this"
+```
+
+Example:
+
+```cmd
+$env:DEBUG='app';node app.js
+```
+
+Then, run the program to be debugged as usual.
+
+npm script example:
+```js
+  "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js",
+```
+
+## Namespace Colors
+
+Every debug instance has a color generated for it based on its namespace name.
+This helps when visually parsing the debug output to identify which debug instance
+a debug line belongs to.
+
+#### Node.js
+
+In Node.js, colors are enabled when stderr is a TTY. You also _should_ install
+the [`supports-color`](https://npmjs.org/supports-color) module alongside debug,
+otherwise debug will only use a small handful of basic colors.
+
+<img width="521" src="https://user-images.githubusercontent.com/71256/29092181-47f6a9e6-7c3a-11e7-9a14-1928d8a711cd.png">
+
+#### Web Browser
+
+Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
+option. These are WebKit web inspectors, Firefox ([since version
+31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
+and the Firebug plugin for Firefox (any version).
+
+<img width="524" src="https://user-images.githubusercontent.com/71256/29092033-b65f9f2e-7c39-11e7-8e32-f6f0d8e865c1.png">
+
+
+## Millisecond diff
+
+When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
+
+<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
+
+When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below:
+
+<img width="647" src="https://user-images.githubusercontent.com/71256/29091956-6bd78372-7c39-11e7-8c55-c948396d6edd.png">
+
+
+## Conventions
+
+If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".  If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable.  You can then use it for normal output as well as debug output.
+
+## Wildcards
+
+The `*` character may be used as a wildcard. Suppose for example your library has
+debuggers named "connect:bodyParser", "connect:compress", "connect:session",
+instead of listing all three with
+`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do
+`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
+
+You can also exclude specific debuggers by prefixing them with a "-" character.
+For example, `DEBUG=*,-connect:*` would include all debuggers except those
+starting with "connect:".
+
+## Environment Variables
+
+When running through Node.js, you can set a few environment variables that will
+change the behavior of the debug logging:
+
+| Name      | Purpose                                         |
+|-----------|-------------------------------------------------|
+| `DEBUG`   | Enables/disables specific debugging namespaces. |
+| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY).  |
+| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
+| `DEBUG_DEPTH` | Object inspection depth.                    |
+| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
+
+
+__Note:__ The environment variables beginning with `DEBUG_` end up being
+converted into an Options object that gets used with `%o`/`%O` formatters.
+See the Node.js documentation for
+[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
+for the complete list.
+
+## Formatters
+
+Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting.
+Below are the officially supported formatters:
+
+| Formatter | Representation |
+|-----------|----------------|
+| `%O`      | Pretty-print an Object on multiple lines. |
+| `%o`      | Pretty-print an Object all on a single line. |
+| `%s`      | String. |
+| `%d`      | Number (both integer and float). |
+| `%j`      | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
+| `%%`      | Single percent sign ('%'). This does not consume an argument. |
+
+
+### Custom formatters
+
+You can add custom formatters by extending the `debug.formatters` object.
+For example, if you wanted to add support for rendering a Buffer as hex with
+`%h`, you could do something like:
+
+```js
+const createDebug = require('debug')
+createDebug.formatters.h = (v) => {
+  return v.toString('hex')
+}
+
+// …elsewhere
+const debug = createDebug('foo')
+debug('this is hex: %h', new Buffer('hello world'))
+//   foo this is hex: 68656c6c6f20776f726c6421 +0ms
+```
+
+
+## Browser Support
+
+You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
+or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
+if you don't want to build it yourself.
+
+Debug's enable state is currently persisted by `localStorage`.
+Consider the situation shown below where you have `worker:a` and `worker:b`,
+and wish to debug both. You can enable this using `localStorage.debug`:
+
+```js
+localStorage.debug = 'worker:*'
+```
+
+And then refresh the page.
+
+```js
+a = debug('worker:a');
+b = debug('worker:b');
+
+setInterval(function(){
+  a('doing some work');
+}, 1000);
+
+setInterval(function(){
+  b('doing some work');
+}, 1200);
+```
+
+In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the "Verbose" log level is _enabled_.
+
+<img width="647" src="https://user-images.githubusercontent.com/7143133/152083257-29034707-c42c-4959-8add-3cee850e6fcf.png">
+
+## Output streams
+
+  By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
+
+Example [_stdout.js_](./examples/node/stdout.js):
+
+```js
+var debug = require('debug');
+var error = debug('app:error');
+
+// by default stderr is used
+error('goes to stderr!');
+
+var log = debug('app:log');
+// set this namespace to log via console.log
+log.log = console.log.bind(console); // don't forget to bind to console!
+log('goes to stdout');
+error('still goes to stderr!');
+
+// set all output to go via console.info
+// overrides all per-namespace log settings
+debug.log = console.info.bind(console);
+error('now goes to stdout via console.info');
+log('still goes to stdout, but via console.info now');
+```
+
+## Extend
+You can simply extend debugger 
+```js
+const log = require('debug')('auth');
+
+//creates new debug instance with extended namespace
+const logSign = log.extend('sign');
+const logLogin = log.extend('login');
+
+log('hello'); // auth hello
+logSign('hello'); //auth:sign hello
+logLogin('hello'); //auth:login hello
+```
+
+## Set dynamically
+
+You can also enable debug dynamically by calling the `enable()` method :
+
+```js
+let debug = require('debug');
+
+console.log(1, debug.enabled('test'));
+
+debug.enable('test');
+console.log(2, debug.enabled('test'));
+
+debug.disable();
+console.log(3, debug.enabled('test'));
+
+```
+
+print :   
+```
+1 false
+2 true
+3 false
+```
+
+Usage :  
+`enable(namespaces)`  
+`namespaces` can include modes separated by a colon and wildcards.
+   
+Note that calling `enable()` completely overrides previously set DEBUG variable : 
+
+```
+$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))'
+=> false
+```
+
+`disable()`
+
+Will disable all namespaces. The functions returns the namespaces currently
+enabled (and skipped). This can be useful if you want to disable debugging
+temporarily without knowing what was enabled to begin with.
+
+For example:
+
+```js
+let debug = require('debug');
+debug.enable('foo:*,-foo:bar');
+let namespaces = debug.disable();
+debug.enable(namespaces);
+```
+
+Note: There is no guarantee that the string will be identical to the initial
+enable string, but semantically they will be identical.
+
+## Checking whether a debug target is enabled
+
+After you've created a debug instance, you can determine whether or not it is
+enabled by checking the `enabled` property:
+
+```javascript
+const debug = require('debug')('http');
+
+if (debug.enabled) {
+  // do stuff...
+}
+```
+
+You can also manually toggle this property to force the debug instance to be
+enabled or disabled.
+
+## Usage in child processes
+
+Due to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process.  
+For example:
+
+```javascript
+worker = fork(WORKER_WRAP_PATH, [workerPath], {
+  stdio: [
+    /* stdin: */ 0,
+    /* stdout: */ 'pipe',
+    /* stderr: */ 'pipe',
+    'ipc',
+  ],
+  env: Object.assign({}, process.env, {
+    DEBUG_COLORS: 1 // without this settings, colors won't be shown
+  }),
+});
+
+worker.stderr.pipe(process.stderr, { end: false });
+```
+
+
+## Authors
+
+ - TJ Holowaychuk
+ - Nathan Rajlich
+ - Andrew Rhyne
+ - Josh Junon
+
+## Backers
+
+Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
+
+<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
+
+
+## Sponsors
+
+Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
+
+<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2014-2017 TJ Holowaychuk &lt;tj@vision-media.ca&gt;
+Copyright (c) 2018-2021 Josh Junon
+
+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, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 101 - 0
node_modules/agent-base/node_modules/debug/package.json

@@ -0,0 +1,101 @@
+{
+  "_from": "debug@4",
+  "_id": "debug@4.3.4",
+  "_inBundle": false,
+  "_integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+  "_location": "/agent-base/debug",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "debug@4",
+    "name": "debug",
+    "escapedName": "debug",
+    "rawSpec": "4",
+    "saveSpec": null,
+    "fetchSpec": "4"
+  },
+  "_requiredBy": [
+    "/agent-base"
+  ],
+  "_resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+  "_shasum": "1319f6579357f2338d3337d2cdd4914bb5dcc865",
+  "_spec": "debug@4",
+  "_where": "D:\\2022\\3\\Mazui\\node_modules\\agent-base",
+  "author": {
+    "name": "Josh Junon",
+    "email": "josh.junon@protonmail.com"
+  },
+  "browser": "./src/browser.js",
+  "bugs": {
+    "url": "https://github.com/debug-js/debug/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "TJ Holowaychuk",
+      "email": "tj@vision-media.ca"
+    },
+    {
+      "name": "Nathan Rajlich",
+      "email": "nathan@tootallnate.net",
+      "url": "http://n8.io"
+    },
+    {
+      "name": "Andrew Rhyne",
+      "email": "rhyneandrew@gmail.com"
+    }
+  ],
+  "dependencies": {
+    "ms": "2.1.2"
+  },
+  "deprecated": false,
+  "description": "Lightweight debugging utility for Node.js and the browser",
+  "devDependencies": {
+    "brfs": "^2.0.1",
+    "browserify": "^16.2.3",
+    "coveralls": "^3.0.2",
+    "istanbul": "^0.4.5",
+    "karma": "^3.1.4",
+    "karma-browserify": "^6.0.0",
+    "karma-chrome-launcher": "^2.2.0",
+    "karma-mocha": "^1.3.0",
+    "mocha": "^5.2.0",
+    "mocha-lcov-reporter": "^1.2.0",
+    "xo": "^0.23.0"
+  },
+  "engines": {
+    "node": ">=6.0"
+  },
+  "files": [
+    "src",
+    "LICENSE",
+    "README.md"
+  ],
+  "homepage": "https://github.com/debug-js/debug#readme",
+  "keywords": [
+    "debug",
+    "log",
+    "debugger"
+  ],
+  "license": "MIT",
+  "main": "./src/index.js",
+  "name": "debug",
+  "peerDependenciesMeta": {
+    "supports-color": {
+      "optional": true
+    }
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/debug-js/debug.git"
+  },
+  "scripts": {
+    "lint": "xo",
+    "test": "npm run test:node && npm run test:browser && npm run lint",
+    "test:browser": "karma start --single-run",
+    "test:coverage": "cat ./coverage/lcov.info | coveralls",
+    "test:node": "istanbul cover _mocha -- test.js"
+  },
+  "version": "4.3.4"
+}

+ 269 - 0
node_modules/agent-base/node_modules/debug/src/browser.js

@@ -0,0 +1,269 @@
+/* eslint-env browser */
+
+/**
+ * This is the web browser implementation of `debug()`.
+ */
+
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.storage = localstorage();
+exports.destroy = (() => {
+	let warned = false;
+
+	return () => {
+		if (!warned) {
+			warned = true;
+			console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+		}
+	};
+})();
+
+/**
+ * Colors.
+ */
+
+exports.colors = [
+	'#0000CC',
+	'#0000FF',
+	'#0033CC',
+	'#0033FF',
+	'#0066CC',
+	'#0066FF',
+	'#0099CC',
+	'#0099FF',
+	'#00CC00',
+	'#00CC33',
+	'#00CC66',
+	'#00CC99',
+	'#00CCCC',
+	'#00CCFF',
+	'#3300CC',
+	'#3300FF',
+	'#3333CC',
+	'#3333FF',
+	'#3366CC',
+	'#3366FF',
+	'#3399CC',
+	'#3399FF',
+	'#33CC00',
+	'#33CC33',
+	'#33CC66',
+	'#33CC99',
+	'#33CCCC',
+	'#33CCFF',
+	'#6600CC',
+	'#6600FF',
+	'#6633CC',
+	'#6633FF',
+	'#66CC00',
+	'#66CC33',
+	'#9900CC',
+	'#9900FF',
+	'#9933CC',
+	'#9933FF',
+	'#99CC00',
+	'#99CC33',
+	'#CC0000',
+	'#CC0033',
+	'#CC0066',
+	'#CC0099',
+	'#CC00CC',
+	'#CC00FF',
+	'#CC3300',
+	'#CC3333',
+	'#CC3366',
+	'#CC3399',
+	'#CC33CC',
+	'#CC33FF',
+	'#CC6600',
+	'#CC6633',
+	'#CC9900',
+	'#CC9933',
+	'#CCCC00',
+	'#CCCC33',
+	'#FF0000',
+	'#FF0033',
+	'#FF0066',
+	'#FF0099',
+	'#FF00CC',
+	'#FF00FF',
+	'#FF3300',
+	'#FF3333',
+	'#FF3366',
+	'#FF3399',
+	'#FF33CC',
+	'#FF33FF',
+	'#FF6600',
+	'#FF6633',
+	'#FF9900',
+	'#FF9933',
+	'#FFCC00',
+	'#FFCC33'
+];
+
+/**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+
+// eslint-disable-next-line complexity
+function useColors() {
+	// NB: In an Electron preload script, document will be defined but not fully
+	// initialized. Since we know we're in Chrome, we'll just detect this case
+	// explicitly
+	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
+		return true;
+	}
+
+	// Internet Explorer and Edge do not support colors.
+	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
+		return false;
+	}
+
+	// Is webkit? http://stackoverflow.com/a/16459606/376773
+	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
+		// Is firebug? http://stackoverflow.com/a/398120/376773
+		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
+		// Is firefox >= v31?
+		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
+		// Double check webkit in userAgent just in case we are in a worker
+		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
+}
+
+/**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs(args) {
+	args[0] = (this.useColors ? '%c' : '') +
+		this.namespace +
+		(this.useColors ? ' %c' : ' ') +
+		args[0] +
+		(this.useColors ? '%c ' : ' ') +
+		'+' + module.exports.humanize(this.diff);
+
+	if (!this.useColors) {
+		return;
+	}
+
+	const c = 'color: ' + this.color;
+	args.splice(1, 0, c, 'color: inherit');
+
+	// The final "%c" is somewhat tricky, because there could be other
+	// arguments passed either before or after the %c, so we need to
+	// figure out the correct index to insert the CSS into
+	let index = 0;
+	let lastC = 0;
+	args[0].replace(/%[a-zA-Z%]/g, match => {
+		if (match === '%%') {
+			return;
+		}
+		index++;
+		if (match === '%c') {
+			// We only are interested in the *last* %c
+			// (the user may have provided their own)
+			lastC = index;
+		}
+	});
+
+	args.splice(lastC, 0, c);
+}
+
+/**
+ * Invokes `console.debug()` when available.
+ * No-op when `console.debug` is not a "function".
+ * If `console.debug` is not available, falls back
+ * to `console.log`.
+ *
+ * @api public
+ */
+exports.log = console.debug || console.log || (() => {});
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+function save(namespaces) {
+	try {
+		if (namespaces) {
+			exports.storage.setItem('debug', namespaces);
+		} else {
+			exports.storage.removeItem('debug');
+		}
+	} catch (error) {
+		// Swallow
+		// XXX (@Qix-) should we be logging these?
+	}
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+function load() {
+	let r;
+	try {
+		r = exports.storage.getItem('debug');
+	} catch (error) {
+		// Swallow
+		// XXX (@Qix-) should we be logging these?
+	}
+
+	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+	if (!r && typeof process !== 'undefined' && 'env' in process) {
+		r = process.env.DEBUG;
+	}
+
+	return r;
+}
+
+/**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
+
+function localstorage() {
+	try {
+		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
+		// The Browser also has localStorage in the global context.
+		return localStorage;
+	} catch (error) {
+		// Swallow
+		// XXX (@Qix-) should we be logging these?
+	}
+}
+
+module.exports = require('./common')(exports);
+
+const {formatters} = module.exports;
+
+/**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+formatters.j = function (v) {
+	try {
+		return JSON.stringify(v);
+	} catch (error) {
+		return '[UnexpectedJSONParseError]: ' + error.message;
+	}
+};

+ 274 - 0
node_modules/agent-base/node_modules/debug/src/common.js

@@ -0,0 +1,274 @@
+
+/**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ */
+
+function setup(env) {
+	createDebug.debug = createDebug;
+	createDebug.default = createDebug;
+	createDebug.coerce = coerce;
+	createDebug.disable = disable;
+	createDebug.enable = enable;
+	createDebug.enabled = enabled;
+	createDebug.humanize = require('ms');
+	createDebug.destroy = destroy;
+
+	Object.keys(env).forEach(key => {
+		createDebug[key] = env[key];
+	});
+
+	/**
+	* The currently active debug mode names, and names to skip.
+	*/
+
+	createDebug.names = [];
+	createDebug.skips = [];
+
+	/**
+	* Map of special "%n" handling functions, for the debug "format" argument.
+	*
+	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+	*/
+	createDebug.formatters = {};
+
+	/**
+	* Selects a color for a debug namespace
+	* @param {String} namespace The namespace string for the debug instance to be colored
+	* @return {Number|String} An ANSI color code for the given namespace
+	* @api private
+	*/
+	function selectColor(namespace) {
+		let hash = 0;
+
+		for (let i = 0; i < namespace.length; i++) {
+			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
+			hash |= 0; // Convert to 32bit integer
+		}
+
+		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
+	}
+	createDebug.selectColor = selectColor;
+
+	/**
+	* Create a debugger with the given `namespace`.
+	*
+	* @param {String} namespace
+	* @return {Function}
+	* @api public
+	*/
+	function createDebug(namespace) {
+		let prevTime;
+		let enableOverride = null;
+		let namespacesCache;
+		let enabledCache;
+
+		function debug(...args) {
+			// Disabled?
+			if (!debug.enabled) {
+				return;
+			}
+
+			const self = debug;
+
+			// Set `diff` timestamp
+			const curr = Number(new Date());
+			const ms = curr - (prevTime || curr);
+			self.diff = ms;
+			self.prev = prevTime;
+			self.curr = curr;
+			prevTime = curr;
+
+			args[0] = createDebug.coerce(args[0]);
+
+			if (typeof args[0] !== 'string') {
+				// Anything else let's inspect with %O
+				args.unshift('%O');
+			}
+
+			// Apply any `formatters` transformations
+			let index = 0;
+			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
+				// If we encounter an escaped % then don't increase the array index
+				if (match === '%%') {
+					return '%';
+				}
+				index++;
+				const formatter = createDebug.formatters[format];
+				if (typeof formatter === 'function') {
+					const val = args[index];
+					match = formatter.call(self, val);
+
+					// Now we need to remove `args[index]` since it's inlined in the `format`
+					args.splice(index, 1);
+					index--;
+				}
+				return match;
+			});
+
+			// Apply env-specific formatting (colors, etc.)
+			createDebug.formatArgs.call(self, args);
+
+			const logFn = self.log || createDebug.log;
+			logFn.apply(self, args);
+		}
+
+		debug.namespace = namespace;
+		debug.useColors = createDebug.useColors();
+		debug.color = createDebug.selectColor(namespace);
+		debug.extend = extend;
+		debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
+
+		Object.defineProperty(debug, 'enabled', {
+			enumerable: true,
+			configurable: false,
+			get: () => {
+				if (enableOverride !== null) {
+					return enableOverride;
+				}
+				if (namespacesCache !== createDebug.namespaces) {
+					namespacesCache = createDebug.namespaces;
+					enabledCache = createDebug.enabled(namespace);
+				}
+
+				return enabledCache;
+			},
+			set: v => {
+				enableOverride = v;
+			}
+		});
+
+		// Env-specific initialization logic for debug instances
+		if (typeof createDebug.init === 'function') {
+			createDebug.init(debug);
+		}
+
+		return debug;
+	}
+
+	function extend(namespace, delimiter) {
+		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+		newDebug.log = this.log;
+		return newDebug;
+	}
+
+	/**
+	* Enables a debug mode by namespaces. This can include modes
+	* separated by a colon and wildcards.
+	*
+	* @param {String} namespaces
+	* @api public
+	*/
+	function enable(namespaces) {
+		createDebug.save(namespaces);
+		createDebug.namespaces = namespaces;
+
+		createDebug.names = [];
+		createDebug.skips = [];
+
+		let i;
+		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
+		const len = split.length;
+
+		for (i = 0; i < len; i++) {
+			if (!split[i]) {
+				// ignore empty strings
+				continue;
+			}
+
+			namespaces = split[i].replace(/\*/g, '.*?');
+
+			if (namespaces[0] === '-') {
+				createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));
+			} else {
+				createDebug.names.push(new RegExp('^' + namespaces + '$'));
+			}
+		}
+	}
+
+	/**
+	* Disable debug output.
+	*
+	* @return {String} namespaces
+	* @api public
+	*/
+	function disable() {
+		const namespaces = [
+			...createDebug.names.map(toNamespace),
+			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
+		].join(',');
+		createDebug.enable('');
+		return namespaces;
+	}
+
+	/**
+	* Returns true if the given mode name is enabled, false otherwise.
+	*
+	* @param {String} name
+	* @return {Boolean}
+	* @api public
+	*/
+	function enabled(name) {
+		if (name[name.length - 1] === '*') {
+			return true;
+		}
+
+		let i;
+		let len;
+
+		for (i = 0, len = createDebug.skips.length; i < len; i++) {
+			if (createDebug.skips[i].test(name)) {
+				return false;
+			}
+		}
+
+		for (i = 0, len = createDebug.names.length; i < len; i++) {
+			if (createDebug.names[i].test(name)) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	* Convert regexp to namespace
+	*
+	* @param {RegExp} regxep
+	* @return {String} namespace
+	* @api private
+	*/
+	function toNamespace(regexp) {
+		return regexp.toString()
+			.substring(2, regexp.toString().length - 2)
+			.replace(/\.\*\?$/, '*');
+	}
+
+	/**
+	* Coerce `val`.
+	*
+	* @param {Mixed} val
+	* @return {Mixed}
+	* @api private
+	*/
+	function coerce(val) {
+		if (val instanceof Error) {
+			return val.stack || val.message;
+		}
+		return val;
+	}
+
+	/**
+	* XXX DO NOT USE. This is a temporary stub function.
+	* XXX It WILL be removed in the next major release.
+	*/
+	function destroy() {
+		console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+	}
+
+	createDebug.enable(createDebug.load());
+
+	return createDebug;
+}
+
+module.exports = setup;

+ 10 - 0
node_modules/agent-base/node_modules/debug/src/index.js

@@ -0,0 +1,10 @@
+/**
+ * Detect Electron renderer / nwjs process, which is node, but we should
+ * treat as a browser.
+ */
+
+if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
+	module.exports = require('./browser.js');
+} else {
+	module.exports = require('./node.js');
+}

+ 263 - 0
node_modules/agent-base/node_modules/debug/src/node.js

@@ -0,0 +1,263 @@
+/**
+ * Module dependencies.
+ */
+
+const tty = require('tty');
+const util = require('util');
+
+/**
+ * This is the Node.js implementation of `debug()`.
+ */
+
+exports.init = init;
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.destroy = util.deprecate(
+	() => {},
+	'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
+);
+
+/**
+ * Colors.
+ */
+
+exports.colors = [6, 2, 3, 4, 5, 1];
+
+try {
+	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
+	// eslint-disable-next-line import/no-extraneous-dependencies
+	const supportsColor = require('supports-color');
+
+	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
+		exports.colors = [
+			20,
+			21,
+			26,
+			27,
+			32,
+			33,
+			38,
+			39,
+			40,
+			41,
+			42,
+			43,
+			44,
+			45,
+			56,
+			57,
+			62,
+			63,
+			68,
+			69,
+			74,
+			75,
+			76,
+			77,
+			78,
+			79,
+			80,
+			81,
+			92,
+			93,
+			98,
+			99,
+			112,
+			113,
+			128,
+			129,
+			134,
+			135,
+			148,
+			149,
+			160,
+			161,
+			162,
+			163,
+			164,
+			165,
+			166,
+			167,
+			168,
+			169,
+			170,
+			171,
+			172,
+			173,
+			178,
+			179,
+			184,
+			185,
+			196,
+			197,
+			198,
+			199,
+			200,
+			201,
+			202,
+			203,
+			204,
+			205,
+			206,
+			207,
+			208,
+			209,
+			214,
+			215,
+			220,
+			221
+		];
+	}
+} catch (error) {
+	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
+}
+
+/**
+ * Build up the default `inspectOpts` object from the environment variables.
+ *
+ *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
+ */
+
+exports.inspectOpts = Object.keys(process.env).filter(key => {
+	return /^debug_/i.test(key);
+}).reduce((obj, key) => {
+	// Camel-case
+	const prop = key
+		.substring(6)
+		.toLowerCase()
+		.replace(/_([a-z])/g, (_, k) => {
+			return k.toUpperCase();
+		});
+
+	// Coerce string value into JS value
+	let val = process.env[key];
+	if (/^(yes|on|true|enabled)$/i.test(val)) {
+		val = true;
+	} else if (/^(no|off|false|disabled)$/i.test(val)) {
+		val = false;
+	} else if (val === 'null') {
+		val = null;
+	} else {
+		val = Number(val);
+	}
+
+	obj[prop] = val;
+	return obj;
+}, {});
+
+/**
+ * Is stdout a TTY? Colored output is enabled when `true`.
+ */
+
+function useColors() {
+	return 'colors' in exports.inspectOpts ?
+		Boolean(exports.inspectOpts.colors) :
+		tty.isatty(process.stderr.fd);
+}
+
+/**
+ * Adds ANSI color escape codes if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs(args) {
+	const {namespace: name, useColors} = this;
+
+	if (useColors) {
+		const c = this.color;
+		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
+		const prefix = `  ${colorCode};1m${name} \u001B[0m`;
+
+		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
+		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
+	} else {
+		args[0] = getDate() + name + ' ' + args[0];
+	}
+}
+
+function getDate() {
+	if (exports.inspectOpts.hideDate) {
+		return '';
+	}
+	return new Date().toISOString() + ' ';
+}
+
+/**
+ * Invokes `util.format()` with the specified arguments and writes to stderr.
+ */
+
+function log(...args) {
+	return process.stderr.write(util.format(...args) + '\n');
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+function save(namespaces) {
+	if (namespaces) {
+		process.env.DEBUG = namespaces;
+	} else {
+		// If you set a process.env field to null or undefined, it gets cast to the
+		// string 'null' or 'undefined'. Just delete instead.
+		delete process.env.DEBUG;
+	}
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+function load() {
+	return process.env.DEBUG;
+}
+
+/**
+ * Init logic for `debug` instances.
+ *
+ * Create a new `inspectOpts` object in case `useColors` is set
+ * differently for a particular `debug` instance.
+ */
+
+function init(debug) {
+	debug.inspectOpts = {};
+
+	const keys = Object.keys(exports.inspectOpts);
+	for (let i = 0; i < keys.length; i++) {
+		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
+	}
+}
+
+module.exports = require('./common')(exports);
+
+const {formatters} = module.exports;
+
+/**
+ * Map %o to `util.inspect()`, all on a single line.
+ */
+
+formatters.o = function (v) {
+	this.inspectOpts.colors = this.useColors;
+	return util.inspect(v, this.inspectOpts)
+		.split('\n')
+		.map(str => str.trim())
+		.join(' ');
+};
+
+/**
+ * Map %O to `util.inspect()`, allowing multiple lines if needed.
+ */
+
+formatters.O = function (v) {
+	this.inspectOpts.colors = this.useColors;
+	return util.inspect(v, this.inspectOpts);
+};

+ 162 - 0
node_modules/agent-base/node_modules/ms/index.js

@@ -0,0 +1,162 @@
+/**
+ * Helpers.
+ */
+
+var s = 1000;
+var m = s * 60;
+var h = m * 60;
+var d = h * 24;
+var w = d * 7;
+var y = d * 365.25;
+
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ *  - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
+
+module.exports = function(val, options) {
+  options = options || {};
+  var type = typeof val;
+  if (type === 'string' && val.length > 0) {
+    return parse(val);
+  } else if (type === 'number' && isFinite(val)) {
+    return options.long ? fmtLong(val) : fmtShort(val);
+  }
+  throw new Error(
+    'val is not a non-empty string or a valid number. val=' +
+      JSON.stringify(val)
+  );
+};
+
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+function parse(str) {
+  str = String(str);
+  if (str.length > 100) {
+    return;
+  }
+  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
+    str
+  );
+  if (!match) {
+    return;
+  }
+  var n = parseFloat(match[1]);
+  var type = (match[2] || 'ms').toLowerCase();
+  switch (type) {
+    case 'years':
+    case 'year':
+    case 'yrs':
+    case 'yr':
+    case 'y':
+      return n * y;
+    case 'weeks':
+    case 'week':
+    case 'w':
+      return n * w;
+    case 'days':
+    case 'day':
+    case 'd':
+      return n * d;
+    case 'hours':
+    case 'hour':
+    case 'hrs':
+    case 'hr':
+    case 'h':
+      return n * h;
+    case 'minutes':
+    case 'minute':
+    case 'mins':
+    case 'min':
+    case 'm':
+      return n * m;
+    case 'seconds':
+    case 'second':
+    case 'secs':
+    case 'sec':
+    case 's':
+      return n * s;
+    case 'milliseconds':
+    case 'millisecond':
+    case 'msecs':
+    case 'msec':
+    case 'ms':
+      return n;
+    default:
+      return undefined;
+  }
+}
+
+/**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function fmtShort(ms) {
+  var msAbs = Math.abs(ms);
+  if (msAbs >= d) {
+    return Math.round(ms / d) + 'd';
+  }
+  if (msAbs >= h) {
+    return Math.round(ms / h) + 'h';
+  }
+  if (msAbs >= m) {
+    return Math.round(ms / m) + 'm';
+  }
+  if (msAbs >= s) {
+    return Math.round(ms / s) + 's';
+  }
+  return ms + 'ms';
+}
+
+/**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function fmtLong(ms) {
+  var msAbs = Math.abs(ms);
+  if (msAbs >= d) {
+    return plural(ms, msAbs, d, 'day');
+  }
+  if (msAbs >= h) {
+    return plural(ms, msAbs, h, 'hour');
+  }
+  if (msAbs >= m) {
+    return plural(ms, msAbs, m, 'minute');
+  }
+  if (msAbs >= s) {
+    return plural(ms, msAbs, s, 'second');
+  }
+  return ms + ' ms';
+}
+
+/**
+ * Pluralization helper.
+ */
+
+function plural(ms, msAbs, n, name) {
+  var isPlural = msAbs >= n * 1.5;
+  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+}

+ 21 - 0
node_modules/agent-base/node_modules/ms/license.md

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Zeit, Inc.
+
+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, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 69 - 0
node_modules/agent-base/node_modules/ms/package.json

@@ -0,0 +1,69 @@
+{
+  "_from": "ms@2.1.2",
+  "_id": "ms@2.1.2",
+  "_inBundle": false,
+  "_integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+  "_location": "/agent-base/ms",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "ms@2.1.2",
+    "name": "ms",
+    "escapedName": "ms",
+    "rawSpec": "2.1.2",
+    "saveSpec": null,
+    "fetchSpec": "2.1.2"
+  },
+  "_requiredBy": [
+    "/agent-base/debug"
+  ],
+  "_resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+  "_shasum": "d09d1f357b443f493382a8eb3ccd183872ae6009",
+  "_spec": "ms@2.1.2",
+  "_where": "D:\\2022\\3\\Mazui\\node_modules\\agent-base\\node_modules\\debug",
+  "bugs": {
+    "url": "https://github.com/zeit/ms/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Tiny millisecond conversion utility",
+  "devDependencies": {
+    "eslint": "4.12.1",
+    "expect.js": "0.3.1",
+    "husky": "0.14.3",
+    "lint-staged": "5.0.0",
+    "mocha": "4.0.1"
+  },
+  "eslintConfig": {
+    "extends": "eslint:recommended",
+    "env": {
+      "node": true,
+      "es6": true
+    }
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/zeit/ms#readme",
+  "license": "MIT",
+  "lint-staged": {
+    "*.js": [
+      "npm run lint",
+      "prettier --single-quote --write",
+      "git add"
+    ]
+  },
+  "main": "./index",
+  "name": "ms",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/zeit/ms.git"
+  },
+  "scripts": {
+    "lint": "eslint lib/* bin/*",
+    "precommit": "lint-staged",
+    "test": "mocha tests.js"
+  },
+  "version": "2.1.2"
+}

+ 60 - 0
node_modules/agent-base/node_modules/ms/readme.md

@@ -0,0 +1,60 @@
+# ms
+
+[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms)
+[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/zeit)
+
+Use this package to easily convert various time formats to milliseconds.
+
+## Examples
+
+```js
+ms('2 days')  // 172800000
+ms('1d')      // 86400000
+ms('10h')     // 36000000
+ms('2.5 hrs') // 9000000
+ms('2h')      // 7200000
+ms('1m')      // 60000
+ms('5s')      // 5000
+ms('1y')      // 31557600000
+ms('100')     // 100
+ms('-3 days') // -259200000
+ms('-1h')     // -3600000
+ms('-200')    // -200
+```
+
+### Convert from Milliseconds
+
+```js
+ms(60000)             // "1m"
+ms(2 * 60000)         // "2m"
+ms(-3 * 60000)        // "-3m"
+ms(ms('10 hours'))    // "10h"
+```
+
+### Time Format Written-Out
+
+```js
+ms(60000, { long: true })             // "1 minute"
+ms(2 * 60000, { long: true })         // "2 minutes"
+ms(-3 * 60000, { long: true })        // "-3 minutes"
+ms(ms('10 hours'), { long: true })    // "10 hours"
+```
+
+## Features
+
+- Works both in [Node.js](https://nodejs.org) and in the browser
+- If a number is supplied to `ms`, a string with a unit is returned
+- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)
+- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned
+
+## Related Packages
+
+- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
+
+## Caught a Bug?
+
+1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
+2. Link the package to the global module directory: `npm link`
+3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
+
+As always, you can run the tests using: `npm test`

+ 98 - 0
node_modules/agent-base/package.json

@@ -0,0 +1,98 @@
+{
+  "_from": "agent-base@^6.0.0",
+  "_id": "agent-base@6.0.2",
+  "_inBundle": false,
+  "_integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+  "_location": "/agent-base",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "agent-base@^6.0.0",
+    "name": "agent-base",
+    "escapedName": "agent-base",
+    "rawSpec": "^6.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^6.0.0"
+  },
+  "_requiredBy": [
+    "/http-proxy-agent",
+    "/https-proxy-agent",
+    "/pac-proxy-agent",
+    "/proxy-agent",
+    "/socks-proxy-agent"
+  ],
+  "_resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+  "_shasum": "49fff58577cfee3f37176feab4c22e00f86d7f77",
+  "_spec": "agent-base@^6.0.0",
+  "_where": "D:\\2022\\3\\Mazui\\node_modules\\proxy-agent",
+  "author": {
+    "name": "Nathan Rajlich",
+    "email": "nathan@tootallnate.net",
+    "url": "http://n8.io/"
+  },
+  "bugs": {
+    "url": "https://github.com/TooTallNate/node-agent-base/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "debug": "4"
+  },
+  "deprecated": false,
+  "description": "Turn a function into an `http.Agent` instance",
+  "devDependencies": {
+    "@types/debug": "4",
+    "@types/mocha": "^5.2.7",
+    "@types/node": "^14.0.20",
+    "@types/semver": "^7.1.0",
+    "@types/ws": "^6.0.3",
+    "@typescript-eslint/eslint-plugin": "1.6.0",
+    "@typescript-eslint/parser": "1.1.0",
+    "async-listen": "^1.2.0",
+    "cpy-cli": "^2.0.0",
+    "eslint": "5.16.0",
+    "eslint-config-airbnb": "17.1.0",
+    "eslint-config-prettier": "4.1.0",
+    "eslint-import-resolver-typescript": "1.1.1",
+    "eslint-plugin-import": "2.16.0",
+    "eslint-plugin-jsx-a11y": "6.2.1",
+    "eslint-plugin-react": "7.12.4",
+    "mocha": "^6.2.0",
+    "rimraf": "^3.0.0",
+    "semver": "^7.1.2",
+    "typescript": "^3.5.3",
+    "ws": "^3.0.0"
+  },
+  "engines": {
+    "node": ">= 6.0.0"
+  },
+  "files": [
+    "dist/src",
+    "src"
+  ],
+  "homepage": "https://github.com/TooTallNate/node-agent-base#readme",
+  "keywords": [
+    "http",
+    "agent",
+    "base",
+    "barebones",
+    "https"
+  ],
+  "license": "MIT",
+  "main": "dist/src/index",
+  "name": "agent-base",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/TooTallNate/node-agent-base.git"
+  },
+  "scripts": {
+    "build": "tsc",
+    "postbuild": "cpy --parents src test '!**/*.ts' dist",
+    "prebuild": "rimraf dist",
+    "prepublishOnly": "npm run build",
+    "test": "mocha --reporter spec dist/test/*.js",
+    "test-lint": "eslint src --ext .js,.ts"
+  },
+  "typings": "dist/src/index",
+  "version": "6.0.2"
+}

+ 345 - 0
node_modules/agent-base/src/index.ts

@@ -0,0 +1,345 @@
+import net from 'net';
+import http from 'http';
+import https from 'https';
+import { Duplex } from 'stream';
+import { EventEmitter } from 'events';
+import createDebug from 'debug';
+import promisify from './promisify';
+
+const debug = createDebug('agent-base');
+
+function isAgent(v: any): v is createAgent.AgentLike {
+	return Boolean(v) && typeof v.addRequest === 'function';
+}
+
+function isSecureEndpoint(): boolean {
+	const { stack } = new Error();
+	if (typeof stack !== 'string') return false;
+	return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1  || l.indexOf('node:https:') !== -1);
+}
+
+function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent;
+function createAgent(
+	callback: createAgent.AgentCallback,
+	opts?: createAgent.AgentOptions
+): createAgent.Agent;
+function createAgent(
+	callback?: createAgent.AgentCallback | createAgent.AgentOptions,
+	opts?: createAgent.AgentOptions
+) {
+	return new createAgent.Agent(callback, opts);
+}
+
+namespace createAgent {
+	export interface ClientRequest extends http.ClientRequest {
+		_last?: boolean;
+		_hadError?: boolean;
+		method: string;
+	}
+
+	export interface AgentRequestOptions {
+		host?: string;
+		path?: string;
+		// `port` on `http.RequestOptions` can be a string or undefined,
+		// but `net.TcpNetConnectOpts` expects only a number
+		port: number;
+	}
+
+	export interface HttpRequestOptions
+		extends AgentRequestOptions,
+			Omit<http.RequestOptions, keyof AgentRequestOptions> {
+		secureEndpoint: false;
+	}
+
+	export interface HttpsRequestOptions
+		extends AgentRequestOptions,
+			Omit<https.RequestOptions, keyof AgentRequestOptions> {
+		secureEndpoint: true;
+	}
+
+	export type RequestOptions = HttpRequestOptions | HttpsRequestOptions;
+
+	export type AgentLike = Pick<createAgent.Agent, 'addRequest'> | http.Agent;
+
+	export type AgentCallbackReturn = Duplex | AgentLike;
+
+	export type AgentCallbackCallback = (
+		err?: Error | null,
+		socket?: createAgent.AgentCallbackReturn
+	) => void;
+
+	export type AgentCallbackPromise = (
+		req: createAgent.ClientRequest,
+		opts: createAgent.RequestOptions
+	) =>
+		| createAgent.AgentCallbackReturn
+		| Promise<createAgent.AgentCallbackReturn>;
+
+	export type AgentCallback = typeof Agent.prototype.callback;
+
+	export type AgentOptions = {
+		timeout?: number;
+	};
+
+	/**
+	 * Base `http.Agent` implementation.
+	 * No pooling/keep-alive is implemented by default.
+	 *
+	 * @param {Function} callback
+	 * @api public
+	 */
+	export class Agent extends EventEmitter {
+		public timeout: number | null;
+		public maxFreeSockets: number;
+		public maxTotalSockets: number;
+		public maxSockets: number;
+		public sockets: {
+			[key: string]: net.Socket[];
+		};
+		public freeSockets: {
+			[key: string]: net.Socket[];
+		};
+		public requests: {
+			[key: string]: http.IncomingMessage[];
+		};
+		public options: https.AgentOptions;
+		private promisifiedCallback?: createAgent.AgentCallbackPromise;
+		private explicitDefaultPort?: number;
+		private explicitProtocol?: string;
+
+		constructor(
+			callback?: createAgent.AgentCallback | createAgent.AgentOptions,
+			_opts?: createAgent.AgentOptions
+		) {
+			super();
+
+			let opts = _opts;
+			if (typeof callback === 'function') {
+				this.callback = callback;
+			} else if (callback) {
+				opts = callback;
+			}
+
+			// Timeout for the socket to be returned from the callback
+			this.timeout = null;
+			if (opts && typeof opts.timeout === 'number') {
+				this.timeout = opts.timeout;
+			}
+
+			// These aren't actually used by `agent-base`, but are required
+			// for the TypeScript definition files in `@types/node` :/
+			this.maxFreeSockets = 1;
+			this.maxSockets = 1;
+			this.maxTotalSockets = Infinity;
+			this.sockets = {};
+			this.freeSockets = {};
+			this.requests = {};
+			this.options = {};
+		}
+
+		get defaultPort(): number {
+			if (typeof this.explicitDefaultPort === 'number') {
+				return this.explicitDefaultPort;
+			}
+			return isSecureEndpoint() ? 443 : 80;
+		}
+
+		set defaultPort(v: number) {
+			this.explicitDefaultPort = v;
+		}
+
+		get protocol(): string {
+			if (typeof this.explicitProtocol === 'string') {
+				return this.explicitProtocol;
+			}
+			return isSecureEndpoint() ? 'https:' : 'http:';
+		}
+
+		set protocol(v: string) {
+			this.explicitProtocol = v;
+		}
+
+		callback(
+			req: createAgent.ClientRequest,
+			opts: createAgent.RequestOptions,
+			fn: createAgent.AgentCallbackCallback
+		): void;
+		callback(
+			req: createAgent.ClientRequest,
+			opts: createAgent.RequestOptions
+		):
+			| createAgent.AgentCallbackReturn
+			| Promise<createAgent.AgentCallbackReturn>;
+		callback(
+			req: createAgent.ClientRequest,
+			opts: createAgent.AgentOptions,
+			fn?: createAgent.AgentCallbackCallback
+		):
+			| createAgent.AgentCallbackReturn
+			| Promise<createAgent.AgentCallbackReturn>
+			| void {
+			throw new Error(
+				'"agent-base" has no default implementation, you must subclass and override `callback()`'
+			);
+		}
+
+		/**
+		 * Called by node-core's "_http_client.js" module when creating
+		 * a new HTTP request with this Agent instance.
+		 *
+		 * @api public
+		 */
+		addRequest(req: ClientRequest, _opts: RequestOptions): void {
+			const opts: RequestOptions = { ..._opts };
+
+			if (typeof opts.secureEndpoint !== 'boolean') {
+				opts.secureEndpoint = isSecureEndpoint();
+			}
+
+			if (opts.host == null) {
+				opts.host = 'localhost';
+			}
+
+			if (opts.port == null) {
+				opts.port = opts.secureEndpoint ? 443 : 80;
+			}
+
+			if (opts.protocol == null) {
+				opts.protocol = opts.secureEndpoint ? 'https:' : 'http:';
+			}
+
+			if (opts.host && opts.path) {
+				// If both a `host` and `path` are specified then it's most
+				// likely the result of a `url.parse()` call... we need to
+				// remove the `path` portion so that `net.connect()` doesn't
+				// attempt to open that as a unix socket file.
+				delete opts.path;
+			}
+
+			delete opts.agent;
+			delete opts.hostname;
+			delete opts._defaultAgent;
+			delete opts.defaultPort;
+			delete opts.createConnection;
+
+			// Hint to use "Connection: close"
+			// XXX: non-documented `http` module API :(
+			req._last = true;
+			req.shouldKeepAlive = false;
+
+			let timedOut = false;
+			let timeoutId: ReturnType<typeof setTimeout> | null = null;
+			const timeoutMs = opts.timeout || this.timeout;
+
+			const onerror = (err: NodeJS.ErrnoException) => {
+				if (req._hadError) return;
+				req.emit('error', err);
+				// For Safety. Some additional errors might fire later on
+				// and we need to make sure we don't double-fire the error event.
+				req._hadError = true;
+			};
+
+			const ontimeout = () => {
+				timeoutId = null;
+				timedOut = true;
+				const err: NodeJS.ErrnoException = new Error(
+					`A "socket" was not created for HTTP request before ${timeoutMs}ms`
+				);
+				err.code = 'ETIMEOUT';
+				onerror(err);
+			};
+
+			const callbackError = (err: NodeJS.ErrnoException) => {
+				if (timedOut) return;
+				if (timeoutId !== null) {
+					clearTimeout(timeoutId);
+					timeoutId = null;
+				}
+				onerror(err);
+			};
+
+			const onsocket = (socket: AgentCallbackReturn) => {
+				if (timedOut) return;
+				if (timeoutId != null) {
+					clearTimeout(timeoutId);
+					timeoutId = null;
+				}
+
+				if (isAgent(socket)) {
+					// `socket` is actually an `http.Agent` instance, so
+					// relinquish responsibility for this `req` to the Agent
+					// from here on
+					debug(
+						'Callback returned another Agent instance %o',
+						socket.constructor.name
+					);
+					(socket as createAgent.Agent).addRequest(req, opts);
+					return;
+				}
+
+				if (socket) {
+					socket.once('free', () => {
+						this.freeSocket(socket as net.Socket, opts);
+					});
+					req.onSocket(socket as net.Socket);
+					return;
+				}
+
+				const err = new Error(
+					`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``
+				);
+				onerror(err);
+			};
+
+			if (typeof this.callback !== 'function') {
+				onerror(new Error('`callback` is not defined'));
+				return;
+			}
+
+			if (!this.promisifiedCallback) {
+				if (this.callback.length >= 3) {
+					debug('Converting legacy callback function to promise');
+					this.promisifiedCallback = promisify(this.callback);
+				} else {
+					this.promisifiedCallback = this.callback;
+				}
+			}
+
+			if (typeof timeoutMs === 'number' && timeoutMs > 0) {
+				timeoutId = setTimeout(ontimeout, timeoutMs);
+			}
+
+			if ('port' in opts && typeof opts.port !== 'number') {
+				opts.port = Number(opts.port);
+			}
+
+			try {
+				debug(
+					'Resolving socket for %o request: %o',
+					opts.protocol,
+					`${req.method} ${req.path}`
+				);
+				Promise.resolve(this.promisifiedCallback(req, opts)).then(
+					onsocket,
+					callbackError
+				);
+			} catch (err) {
+				Promise.reject(err).catch(callbackError);
+			}
+		}
+
+		freeSocket(socket: net.Socket, opts: AgentOptions) {
+			debug('Freeing socket %o %o', socket.constructor.name, opts);
+			socket.destroy();
+		}
+
+		destroy() {
+			debug('Destroying agent %o', this.constructor.name);
+		}
+	}
+
+	// So that `instanceof` works correctly
+	createAgent.prototype = createAgent.Agent.prototype;
+}
+
+export = createAgent;

+ 33 - 0
node_modules/agent-base/src/promisify.ts

@@ -0,0 +1,33 @@
+import {
+	Agent,
+	ClientRequest,
+	RequestOptions,
+	AgentCallbackCallback,
+	AgentCallbackPromise,
+	AgentCallbackReturn
+} from './index';
+
+type LegacyCallback = (
+	req: ClientRequest,
+	opts: RequestOptions,
+	fn: AgentCallbackCallback
+) => void;
+
+export default function promisify(fn: LegacyCallback): AgentCallbackPromise {
+	return function(this: Agent, req: ClientRequest, opts: RequestOptions) {
+		return new Promise((resolve, reject) => {
+			fn.call(
+				this,
+				req,
+				opts,
+				(err: Error | null | undefined, rtn?: AgentCallbackReturn) => {
+					if (err) {
+						reject(err);
+					} else {
+						resolve(rtn);
+					}
+				}
+			);
+		});
+	};
+}

+ 170 - 0
node_modules/agentkeepalive/History.md

@@ -0,0 +1,170 @@
+
+3.5.2 / 2018-10-19
+==================
+
+**fixes**
+  * [[`5751fc1`](http://github.com/node-modules/agentkeepalive/commit/5751fc1180ed6544602c681ffbd08ca66a0cb12c)] - fix: sockLen being miscalculated when removing sockets (#60) (Ehden Sinai <<cixel@users.noreply.github.com>>)
+
+3.5.1 / 2018-07-31
+==================
+
+**fixes**
+  * [[`495f1ab`](http://github.com/node-modules/agentkeepalive/commit/495f1ab625d43945d72f68096b97db723d4f0657)] - fix: add the lost npm files (#66) (Henry Zhuang <<zhuanghengfei@gmail.com>>)
+
+3.5.0 / 2018-07-31
+==================
+
+**features**
+  * [[`16f5aea`](http://github.com/node-modules/agentkeepalive/commit/16f5aeadfda57f1c602652f1472a63cc83cd05bf)] - feat: add typing define. (#65) (Henry Zhuang <<zhuanghengfei@gmail.com>>)
+
+**others**
+  * [[`28fa062`](http://github.com/node-modules/agentkeepalive/commit/28fa06246fb5103f88ebeeb8563757a9078b8157)] - docs: add "per host" to description of maxFreeSockets (tony-gutierrez <<tony.gutierrez@bluefletch.com>>)
+  * [[`7df2577`](http://github.com/node-modules/agentkeepalive/commit/7df25774f00a1031ca4daad2878a17e0539072a2)] - test: run test on node 10 (#63) (fengmk2 <<fengmk2@gmail.com>>)
+
+3.4.1 / 2018-03-08
+==================
+
+**fixes**
+  * [[`4d3a3b1`](http://github.com/node-modules/agentkeepalive/commit/4d3a3b1f7b16595febbbd39eeed72b2663549014)] - fix: Handle ipv6 addresses in host-header correctly with TLS (#53) (Mattias Holmlund <<u376@m1.holmlund.se>>)
+
+**others**
+  * [[`55a7a5c`](http://github.com/node-modules/agentkeepalive/commit/55a7a5cd33e97f9a8370083dcb041c5552f10ac9)] - test: stop timer after test end (fengmk2 <<fengmk2@gmail.com>>)
+
+3.4.0 / 2018-02-27
+==================
+
+**features**
+  * [[`bc7cadb`](http://github.com/node-modules/agentkeepalive/commit/bc7cadb30ecd2071e2b341ac53ae1a2b8155c43d)] - feat: use socket custom freeSocketKeepAliveTimeout first (#59) (fengmk2 <<fengmk2@gmail.com>>)
+
+**others**
+  * [[`138eda8`](http://github.com/node-modules/agentkeepalive/commit/138eda81e10b632aaa87bea0cb66d8667124c4e8)] - doc: fix `keepAliveMsecs` params description (#55) (Hongcai Deng <<admin@dhchouse.com>>)
+
+3.3.0 / 2017-06-20
+==================
+
+  * feat: add statusChanged getter (#51)
+  * chore: format License
+
+3.2.0 / 2017-06-10
+==================
+
+  * feat: add expiring active sockets
+  * test: add node 8 (#49)
+
+3.1.0 / 2017-02-20
+==================
+
+  * feat: timeout support humanize ms (#48)
+
+3.0.0 / 2016-12-20
+==================
+
+  * fix: emit agent socket close event
+  * test: add remove excess calls to removeSocket
+  * test: use egg-ci
+  * test: refactor test with eslint rules
+  * feat: merge _http_agent.js from 7.2.1
+
+2.2.0 / 2016-06-26
+==================
+
+  * feat: Add browser shim (noop) for isomorphic use. (#39)
+  * chore: add security check badge
+
+2.1.1 / 2016-04-06
+==================
+
+  * https: fix ssl socket leak when keepalive is used
+  * chore: remove circle ci image
+
+2.1.0 / 2016-04-02
+==================
+
+  * fix: opened sockets number overflow maxSockets
+
+2.0.5 / 2016-03-16
+==================
+
+  * fix: pick _evictSession to httpsAgent
+
+2.0.4 / 2016-03-13
+==================
+
+  * test: add Circle ci
+  * test: add appveyor ci build
+  * refactor: make sure only one error listener
+  * chore: use codecov
+  * fix: handle idle socket error
+  * test: run on more node versions
+
+2.0.3 / 2015-08-03
+==================
+
+ * fix: add default error handler to avoid Unhandled error event throw
+
+2.0.2 / 2015-04-25
+==================
+
+ * fix: remove socket from freeSockets on 'timeout' (@pmalouin)
+
+2.0.1 / 2015-04-19
+==================
+
+ * fix: add timeoutSocketCount to getCurrentStatus()
+ * feat(getCurrentStatus): add getCurrentStatus
+
+2.0.0 / 2015-04-01
+==================
+
+ * fix: socket.destroyed always be undefined on 0.10.x
+ * Make it compatible with node v0.10.x (@lattmann)
+
+1.2.1 / 2015-03-23
+==================
+
+ * patch from iojs: don't overwrite servername option
+ * patch commits from joyent/node
+ * add max sockets test case
+ * add nagle algorithm delayed link
+
+1.2.0 / 2014-09-02
+==================
+
+ * allow set keepAliveTimeout = 0
+ * support timeout on working socket. fixed #6
+
+1.1.0 / 2014-08-28
+==================
+
+ * add some socket counter for deep monitor
+
+1.0.0 / 2014-08-13
+==================
+
+ * update _http_agent, only support 0.11+, only support node 0.11.0+
+
+0.2.2 / 2013-11-19 
+==================
+
+  * support node 0.8 and node 0.10
+
+0.2.1 / 2013-11-08 
+==================
+
+  * fix socket does not timeout bug, it will hang on life, must use 0.2.x on node 0.11
+
+0.2.0 / 2013-11-06 
+==================
+
+  * use keepalive agent on node 0.11+ impl
+
+0.1.5 / 2013-06-24 
+==================
+
+  * support coveralls
+  * add node 0.10 test
+  * add 0.8.22 original https.js
+  * add original http.js module to diff
+  * update jscover
+  * mv pem to fixtures
+  * add https agent usage

+ 248 - 0
node_modules/agentkeepalive/README.md

@@ -0,0 +1,248 @@
+# agentkeepalive
+
+[![NPM version][npm-image]][npm-url]
+[![build status][travis-image]][travis-url]
+[![Appveyor status][appveyor-image]][appveyor-url]
+[![Test coverage][codecov-image]][codecov-url]
+[![David deps][david-image]][david-url]
+[![Known Vulnerabilities][snyk-image]][snyk-url]
+[![npm download][download-image]][download-url]
+
+[npm-image]: https://img.shields.io/npm/v/agentkeepalive.svg?style=flat
+[npm-url]: https://npmjs.org/package/agentkeepalive
+[travis-image]: https://img.shields.io/travis/node-modules/agentkeepalive.svg?style=flat
+[travis-url]: https://travis-ci.org/node-modules/agentkeepalive
+[appveyor-image]: https://ci.appveyor.com/api/projects/status/k7ct4s47di6m5uy2?svg=true
+[appveyor-url]: https://ci.appveyor.com/project/fengmk2/agentkeepalive
+[codecov-image]: https://codecov.io/gh/node-modules/agentkeepalive/branch/master/graph/badge.svg
+[codecov-url]: https://codecov.io/gh/node-modules/agentkeepalive
+[david-image]: https://img.shields.io/david/node-modules/agentkeepalive.svg?style=flat
+[david-url]: https://david-dm.org/node-modules/agentkeepalive
+[snyk-image]: https://snyk.io/test/npm/agentkeepalive/badge.svg?style=flat-square
+[snyk-url]: https://snyk.io/test/npm/agentkeepalive
+[download-image]: https://img.shields.io/npm/dm/agentkeepalive.svg?style=flat-square
+[download-url]: https://npmjs.org/package/agentkeepalive
+
+The Node.js's missing `keep alive` `http.Agent`. Support `http` and `https`.
+
+## What's different from original `http.Agent`?
+
+- `keepAlive=true` by default
+- Disable Nagle's algorithm: `socket.setNoDelay(true)`
+- Add free socket timeout: avoid long time inactivity socket leak in the free-sockets queue.
+- Add active socket timeout: avoid long time inactivity socket leak in the active-sockets queue.
+
+## Install
+
+```bash
+$ npm install agentkeepalive --save
+```
+
+## new Agent([options])
+
+* `options` {Object} Set of configurable options to set on the agent.
+  Can have the following fields:
+  * `keepAlive` {Boolean} Keep sockets around in a pool to be used by
+    other requests in the future. Default = `true`.
+  * `keepAliveMsecs` {Number} When using the keepAlive option, specifies the initial delay
+    for TCP Keep-Alive packets. Ignored when the keepAlive option is false or undefined. Defaults to 1000.
+    Default = `1000`.  Only relevant if `keepAlive` is set to `true`.
+  * `freeSocketKeepAliveTimeout`: {Number} Sets the free socket to timeout
+    after `freeSocketKeepAliveTimeout` milliseconds of inactivity on the free socket.
+    Default is `15000`.
+    Only relevant if `keepAlive` is set to `true`.
+  * `timeout`: {Number} Sets the working socket to timeout
+    after `timeout` milliseconds of inactivity on the working socket.
+    Default is `freeSocketKeepAliveTimeout * 2`.
+  * `maxSockets` {Number} Maximum number of sockets to allow per
+    host. Default = `Infinity`.
+  * `maxFreeSockets` {Number} Maximum number of sockets (per host) to leave open
+    in a free state. Only relevant if `keepAlive` is set to `true`.
+    Default = `256`.
+  * `socketActiveTTL` {Number} Sets the socket active time to live, even if it's in use.
+    If not setted the behaviour continues the same (the socket will be released only when free)
+    Default = `null`.
+
+## Usage
+
+```js
+const http = require('http');
+const Agent = require('agentkeepalive');
+
+const keepaliveAgent = new Agent({
+  maxSockets: 100,
+  maxFreeSockets: 10,
+  timeout: 60000,
+  freeSocketKeepAliveTimeout: 30000, // free socket keepalive for 30 seconds
+});
+
+const options = {
+  host: 'cnodejs.org',
+  port: 80,
+  path: '/',
+  method: 'GET',
+  agent: keepaliveAgent,
+};
+
+const req = http.request(options, res => {
+  console.log('STATUS: ' + res.statusCode);
+  console.log('HEADERS: ' + JSON.stringify(res.headers));
+  res.setEncoding('utf8');
+  res.on('data', function (chunk) {
+    console.log('BODY: ' + chunk);
+  });
+});
+req.on('error', e => {
+  console.log('problem with request: ' + e.message);
+});
+req.end();
+
+setTimeout(() => {
+  if (keepaliveAgent.statusChanged) {
+    console.log('[%s] agent status changed: %j', Date(), keepaliveAgent.getCurrentStatus());
+  }
+}, 2000);
+
+```
+
+### `getter agent.statusChanged`
+
+counters have change or not after last checkpoint.
+
+### `agent.getCurrentStatus()`
+
+`agent.getCurrentStatus()` will return a object to show the status of this agent:
+
+```js
+{
+  createSocketCount: 10,
+  closeSocketCount: 5,
+  timeoutSocketCount: 0,
+  requestCount: 5,
+  freeSockets: { 'localhost:57479:': 3 },
+  sockets: { 'localhost:57479:': 5 },
+  requests: {}
+}
+```
+
+### Support `https`
+
+```js
+const https = require('https');
+const HttpsAgent = require('agentkeepalive').HttpsAgent;
+
+const keepaliveAgent = new HttpsAgent();
+// https://www.google.com/search?q=nodejs&sugexp=chrome,mod=12&sourceid=chrome&ie=UTF-8
+const options = {
+  host: 'www.google.com',
+  port: 443,
+  path: '/search?q=nodejs&sugexp=chrome,mod=12&sourceid=chrome&ie=UTF-8',
+  method: 'GET',
+  agent: keepaliveAgent,
+};
+
+const req = https.request(options, res => {
+  console.log('STATUS: ' + res.statusCode);
+  console.log('HEADERS: ' + JSON.stringify(res.headers));
+  res.setEncoding('utf8');
+  res.on('data', chunk => {
+    console.log('BODY: ' + chunk);
+  });
+});
+
+req.on('error', e => {
+  console.log('problem with request: ' + e.message);
+});
+req.end();
+
+setTimeout(() => {
+  console.log('agent status: %j', keepaliveAgent.getCurrentStatus());
+}, 2000);
+```
+
+## [Benchmark](https://github.com/node-modules/agentkeepalive/tree/master/benchmark)
+
+run the benchmark:
+
+```bash
+cd benchmark
+sh start.sh
+```
+
+Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz
+
+node@v0.8.9
+
+50 maxSockets, 60 concurrent, 1000 requests per concurrent, 5ms delay
+
+Keep alive agent (30 seconds):
+
+```js
+Transactions:          60000 hits
+Availability:         100.00 %
+Elapsed time:          29.70 secs
+Data transferred:        14.88 MB
+Response time:            0.03 secs
+Transaction rate:      2020.20 trans/sec
+Throughput:           0.50 MB/sec
+Concurrency:           59.84
+Successful transactions:       60000
+Failed transactions:             0
+Longest transaction:          0.15
+Shortest transaction:         0.01
+```
+
+Normal agent:
+
+```js
+Transactions:          60000 hits
+Availability:         100.00 %
+Elapsed time:          46.53 secs
+Data transferred:        14.88 MB
+Response time:            0.05 secs
+Transaction rate:      1289.49 trans/sec
+Throughput:           0.32 MB/sec
+Concurrency:           59.81
+Successful transactions:       60000
+Failed transactions:             0
+Longest transaction:          0.45
+Shortest transaction:         0.00
+```
+
+Socket created:
+
+```
+[proxy.js:120000] keepalive, 50 created, 60000 requestFinished, 1200 req/socket, 0 requests, 0 sockets, 0 unusedSockets, 50 timeout
+{" <10ms":662," <15ms":17825," <20ms":20552," <30ms":17646," <40ms":2315," <50ms":567," <100ms":377," <150ms":56," <200ms":0," >=200ms+":0}
+----------------------------------------------------------------
+[proxy.js:120000] normal   , 53866 created, 84260 requestFinished, 1.56 req/socket, 0 requests, 0 sockets
+{" <10ms":75," <15ms":1112," <20ms":10947," <30ms":32130," <40ms":8228," <50ms":3002," <100ms":4274," <150ms":181," <200ms":18," >=200ms+":33}
+```
+
+## License
+
+```
+(The MIT License)
+
+Copyright(c) node-modules and other contributors.
+Copyright(c) 2012 - 2015 fengmk2 <fengmk2@gmail.com>
+
+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, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+```

+ 5 - 0
node_modules/agentkeepalive/browser.js

@@ -0,0 +1,5 @@
+module.exports = noop;
+module.exports.HttpsAgent = noop;
+
+// Noop function for browser since native api's don't use agents.
+function noop () {}

+ 43 - 0
node_modules/agentkeepalive/index.d.ts

@@ -0,0 +1,43 @@
+declare module "agentkeepalive" {
+  import * as http from 'http';
+  import * as https from 'https';
+
+  interface AgentStatus {
+    createSocketCount: number,
+    createSocketErrorCount: number,
+    closeSocketCount: number,
+    errorSocketCount: number,
+    timeoutSocketCount: number,
+    requestCount: number,
+    freeSockets: object,
+    sockets: object,
+    requests: object,
+  }
+
+  interface HttpOptions extends http.AgentOptions {
+    freeSocketKeepAliveTimeout?: number;
+    timeout?: number;
+    socketActiveTTL?: number;
+  }
+
+  interface HttpsOptions extends https.AgentOptions {
+    freeSocketKeepAliveTimeout?: number;
+    timeout?: number;
+    socketActiveTTL?: number;
+  }
+
+  class internal extends http.Agent {
+    constructor(opts?: HttpOptions);
+    readonly statusChanged: boolean;
+    createSocket(req: http.IncomingMessage, options: http.RequestOptions, cb: Function): void;
+    getCurrentStatus(): AgentStatus;
+  }
+
+  namespace internal {
+    export class HttpsAgent extends internal {
+      constructor(opts?: HttpsOptions);
+    }
+  }
+
+  export = internal;
+}

+ 4 - 0
node_modules/agentkeepalive/index.js

@@ -0,0 +1,4 @@
+'use strict';
+
+module.exports = require('./lib/agent');
+module.exports.HttpsAgent = require('./lib/https_agent');

+ 416 - 0
node_modules/agentkeepalive/lib/_http_agent.js

@@ -0,0 +1,416 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// patch from https://github.com/nodejs/node/blob/v7.2.1/lib/_http_agent.js
+
+'use strict';
+
+const net = require('net');
+const util = require('util');
+const EventEmitter = require('events');
+const debug = util.debuglog('http');
+
+// New Agent code.
+
+// The largest departure from the previous implementation is that
+// an Agent instance holds connections for a variable number of host:ports.
+// Surprisingly, this is still API compatible as far as third parties are
+// concerned. The only code that really notices the difference is the
+// request object.
+
+// Another departure is that all code related to HTTP parsing is in
+// ClientRequest.onSocket(). The Agent is now *strictly*
+// concerned with managing a connection pool.
+
+function Agent(options) {
+  if (!(this instanceof Agent))
+    return new Agent(options);
+
+  EventEmitter.call(this);
+
+  var self = this;
+
+  self.defaultPort = 80;
+  self.protocol = 'http:';
+
+  self.options = util._extend({}, options);
+
+  // don't confuse net and make it think that we're connecting to a pipe
+  self.options.path = null;
+  self.requests = {};
+  self.sockets = {};
+  self.freeSockets = {};
+  self.keepAliveMsecs = self.options.keepAliveMsecs || 1000;
+  self.keepAlive = self.options.keepAlive || false;
+  self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets;
+  self.maxFreeSockets = self.options.maxFreeSockets || 256;
+
+  // [patch start]
+  // free keep-alive socket timeout. By default free socket do not have a timeout.
+  self.freeSocketKeepAliveTimeout = self.options.freeSocketKeepAliveTimeout || 0;
+  // working socket timeout. By default working socket do not have a timeout.
+  self.timeout = self.options.timeout || 0;
+  // the socket active time to live, even if it's in use
+  this.socketActiveTTL = this.options.socketActiveTTL || null;
+  // [patch end]
+
+  self.on('free', function(socket, options) {
+    var name = self.getName(options);
+    debug('agent.on(free)', name);
+
+    if (socket.writable &&
+        self.requests[name] && self.requests[name].length) {
+      // [patch start]
+      debug('continue handle next request');
+      // [patch end]
+      self.requests[name].shift().onSocket(socket);
+      if (self.requests[name].length === 0) {
+        // don't leak
+        delete self.requests[name];
+      }
+    } else {
+      // If there are no pending requests, then put it in
+      // the freeSockets pool, but only if we're allowed to do so.
+      var req = socket._httpMessage;
+      if (req &&
+          req.shouldKeepAlive &&
+          socket.writable &&
+          self.keepAlive) {
+        var freeSockets = self.freeSockets[name];
+        var freeLen = freeSockets ? freeSockets.length : 0;
+        var count = freeLen;
+        if (self.sockets[name])
+          count += self.sockets[name].length;
+
+        if (count > self.maxSockets || freeLen >= self.maxFreeSockets) {
+          socket.destroy();
+        } else {
+          freeSockets = freeSockets || [];
+          self.freeSockets[name] = freeSockets;
+          socket.setKeepAlive(true, self.keepAliveMsecs);
+          socket.unref();
+          socket._httpMessage = null;
+          self.removeSocket(socket, options);
+          freeSockets.push(socket);
+
+          // [patch start]
+          // Add a default error handler to avoid Unhandled 'error' event throw on idle socket
+          // https://github.com/node-modules/agentkeepalive/issues/25
+          // https://github.com/nodejs/node/pull/4482 (fixed in >= 4.4.0 and >= 5.4.0)
+          if (socket.listeners('error').length === 0) {
+            socket.once('error', freeSocketErrorListener);
+          }
+          // set free keepalive timer
+          // try to use socket custom freeSocketKeepAliveTimeout first
+          const freeSocketKeepAliveTimeout = socket.freeSocketKeepAliveTimeout || self.freeSocketKeepAliveTimeout;
+          socket.setTimeout(freeSocketKeepAliveTimeout);
+          debug(`push to free socket queue and wait for ${freeSocketKeepAliveTimeout}ms`);
+          // [patch end]
+        }
+      } else {
+        socket.destroy();
+      }
+    }
+  });
+}
+
+util.inherits(Agent, EventEmitter);
+exports.Agent = Agent;
+
+// [patch start]
+function freeSocketErrorListener(err) {
+  var socket = this;
+  debug('SOCKET ERROR on FREE socket:', err.message, err.stack);
+  socket.destroy();
+  socket.emit('agentRemove');
+}
+// [patch end]
+
+Agent.defaultMaxSockets = Infinity;
+
+Agent.prototype.createConnection = net.createConnection;
+
+// Get the key for a given set of request options
+Agent.prototype.getName = function getName(options) {
+  var name = options.host || 'localhost';
+
+  name += ':';
+  if (options.port)
+    name += options.port;
+
+  name += ':';
+  if (options.localAddress)
+    name += options.localAddress;
+
+  // Pacify parallel/test-http-agent-getname by only appending
+  // the ':' when options.family is set.
+  if (options.family === 4 || options.family === 6)
+    name += ':' + options.family;
+
+  return name;
+};
+
+// [patch start]
+function handleSocketCreation(req) {
+  return function(err, newSocket) {
+    if (err) {
+      process.nextTick(function() {
+        req.emit('error', err);
+      });
+      return;
+    }
+    req.onSocket(newSocket);
+  }
+}
+// [patch end]
+
+Agent.prototype.addRequest = function addRequest(req, options, port/*legacy*/,
+                                                 localAddress/*legacy*/) {
+  // Legacy API: addRequest(req, host, port, localAddress)
+  if (typeof options === 'string') {
+    options = {
+      host: options,
+      port,
+      localAddress
+    };
+  }
+
+  options = util._extend({}, options);
+  options = util._extend(options, this.options);
+
+  if (!options.servername)
+    options.servername = calculateServerName(options, req);
+
+  var name = this.getName(options);
+  if (!this.sockets[name]) {
+    this.sockets[name] = [];
+  }
+
+  var freeLen = this.freeSockets[name] ? this.freeSockets[name].length : 0;
+  var sockLen = freeLen + this.sockets[name].length;
+
+  if (freeLen) {
+    // we have a free socket, so use that.
+    var socket = this.freeSockets[name].shift();
+    debug('have free socket');
+
+    // [patch start]
+    // remove free socket error event handler
+    socket.removeListener('error', freeSocketErrorListener);
+    // restart the default timer
+    socket.setTimeout(this.timeout);
+
+    if (this.socketActiveTTL && Date.now() - socket.createdTime > this.socketActiveTTL) {
+      debug(`socket ${socket.createdTime} expired`);
+      socket.destroy();
+      return this.createSocket(req, options, handleSocketCreation(req));
+    }
+    // [patch end]
+
+    // don't leak
+    if (!this.freeSockets[name].length)
+      delete this.freeSockets[name];
+
+    socket.ref();
+    req.onSocket(socket);
+    this.sockets[name].push(socket);
+  } else if (sockLen < this.maxSockets) {
+    debug('call onSocket', sockLen, freeLen);
+    // If we are under maxSockets create a new one.
+    // [patch start]
+    this.createSocket(req, options, handleSocketCreation(req));
+    // [patch end]
+  } else {
+    debug('wait for socket');
+    // We are over limit so we'll add it to the queue.
+    if (!this.requests[name]) {
+      this.requests[name] = [];
+    }
+    this.requests[name].push(req);
+  }
+};
+
+Agent.prototype.createSocket = function createSocket(req, options, cb) {
+  var self = this;
+  options = util._extend({}, options);
+  options = util._extend(options, self.options);
+
+  if (!options.servername)
+    options.servername = calculateServerName(options, req);
+
+  var name = self.getName(options);
+  options._agentKey = name;
+
+  debug('createConnection', name, options);
+  options.encoding = null;
+  var called = false;
+  const newSocket = self.createConnection(options, oncreate);
+  // [patch start]
+  if (newSocket) {
+    oncreate(null, Object.assign(newSocket, { createdTime: Date.now() }));
+  }
+  // [patch end]
+  function oncreate(err, s) {
+    if (called)
+      return;
+    called = true;
+    if (err)
+      return cb(err);
+    if (!self.sockets[name]) {
+      self.sockets[name] = [];
+    }
+    self.sockets[name].push(s);
+    debug('sockets', name, self.sockets[name].length);
+
+    function onFree() {
+      self.emit('free', s, options);
+    }
+    s.on('free', onFree);
+
+    function onClose(err) {
+      debug('CLIENT socket onClose');
+      // This is the only place where sockets get removed from the Agent.
+      // If you want to remove a socket from the pool, just close it.
+      // All socket errors end in a close event anyway.
+      self.removeSocket(s, options);
+
+      // [patch start]
+      self.emit('close');
+      // [patch end]
+    }
+    s.on('close', onClose);
+
+    // [patch start]
+    // start socket timeout handler
+    function onTimeout() {
+      debug('CLIENT socket onTimeout');
+      s.destroy();
+      // Remove it from freeSockets immediately to prevent new requests from being sent through this socket.
+      self.removeSocket(s, options);
+      self.emit('timeout');
+    }
+    s.on('timeout', onTimeout);
+    // set the default timer
+    s.setTimeout(self.timeout);
+    // [patch end]
+
+    function onRemove() {
+      // We need this function for cases like HTTP 'upgrade'
+      // (defined by WebSockets) where we need to remove a socket from the
+      // pool because it'll be locked up indefinitely
+      debug('CLIENT socket onRemove');
+      self.removeSocket(s, options);
+      s.removeListener('close', onClose);
+      s.removeListener('free', onFree);
+      s.removeListener('agentRemove', onRemove);
+
+      // [patch start]
+      // remove socket timeout handler
+      s.setTimeout(0, onTimeout);
+      // [patch end]
+    }
+    s.on('agentRemove', onRemove);
+    cb(null, s);
+  }
+};
+
+function calculateServerName(options, req) {
+  let servername = options.host;
+  const hostHeader = req.getHeader('host');
+  if (hostHeader) {
+    // abc => abc
+    // abc:123 => abc
+    // [::1] => ::1
+    // [::1]:123 => ::1
+    if (hostHeader.startsWith('[')) {
+      const index = hostHeader.indexOf(']');
+      if (index === -1) {
+        // Leading '[', but no ']'. Need to do something...
+        servername = hostHeader;
+      } else {
+        servername = hostHeader.substr(1, index - 1);
+      }
+    } else {
+      servername = hostHeader.split(':', 1)[0];
+    }
+  }
+  return servername;
+}
+
+Agent.prototype.removeSocket = function removeSocket(s, options) {
+  var name = this.getName(options);
+  debug('removeSocket', name, 'writable:', s.writable);
+  var sets = [this.sockets];
+
+  // If the socket was destroyed, remove it from the free buffers too.
+  if (!s.writable)
+    sets.push(this.freeSockets);
+
+  for (var sk = 0; sk < sets.length; sk++) {
+    var sockets = sets[sk];
+
+    if (sockets[name]) {
+      var index = sockets[name].indexOf(s);
+      if (index !== -1) {
+        sockets[name].splice(index, 1);
+        // Don't leak
+        if (sockets[name].length === 0)
+          delete sockets[name];
+      }
+    }
+  }
+
+  // [patch start]
+  var freeLen = this.freeSockets[name] ? this.freeSockets[name].length : 0;
+  var sockLen = freeLen + (this.sockets[name] ? this.sockets[name].length : 0);
+  // [patch end]
+
+  if (this.requests[name] && this.requests[name].length && sockLen < this.maxSockets) {
+    debug('removeSocket, have a request, make a socket');
+    var req = this.requests[name][0];
+    // If we have pending requests and a socket gets closed make a new one
+    this.createSocket(req, options, function(err, newSocket) {
+      if (err) {
+        process.nextTick(function() {
+          req.emit('error', err);
+        });
+        return;
+      }
+      newSocket.emit('free');
+    });
+  }
+};
+
+Agent.prototype.destroy = function destroy() {
+  var sets = [this.freeSockets, this.sockets];
+  for (var s = 0; s < sets.length; s++) {
+    var set = sets[s];
+    var keys = Object.keys(set);
+    for (var v = 0; v < keys.length; v++) {
+      var setName = set[keys[v]];
+      for (var n = 0; n < setName.length; n++) {
+        setName[n].destroy();
+      }
+    }
+  }
+};
+
+exports.globalAgent = new Agent();

+ 133 - 0
node_modules/agentkeepalive/lib/agent.js

@@ -0,0 +1,133 @@
+/**
+ * refer:
+ *   * @atimb "Real keep-alive HTTP agent": https://gist.github.com/2963672
+ *   * https://github.com/joyent/node/blob/master/lib/http.js
+ *   * https://github.com/joyent/node/blob/master/lib/https.js
+ *   * https://github.com/joyent/node/blob/master/lib/_http_agent.js
+ */
+
+'use strict';
+
+const OriginalAgent = require('./_http_agent').Agent;
+const ms = require('humanize-ms');
+
+class Agent extends OriginalAgent {
+  constructor(options) {
+    options = options || {};
+    options.keepAlive = options.keepAlive !== false;
+    // default is keep-alive and 15s free socket timeout
+    if (options.freeSocketKeepAliveTimeout === undefined) {
+      options.freeSocketKeepAliveTimeout = 15000;
+    }
+    // Legacy API: keepAliveTimeout should be rename to `freeSocketKeepAliveTimeout`
+    if (options.keepAliveTimeout) {
+      options.freeSocketKeepAliveTimeout = options.keepAliveTimeout;
+    }
+    options.freeSocketKeepAliveTimeout = ms(options.freeSocketKeepAliveTimeout);
+
+    // Sets the socket to timeout after timeout milliseconds of inactivity on the socket.
+    // By default is double free socket keepalive timeout.
+    if (options.timeout === undefined) {
+      options.timeout = options.freeSocketKeepAliveTimeout * 2;
+      // make sure socket default inactivity timeout >= 30s
+      if (options.timeout < 30000) {
+        options.timeout = 30000;
+      }
+    }
+    options.timeout = ms(options.timeout);
+
+    super(options);
+
+    this.createSocketCount = 0;
+    this.createSocketCountLastCheck = 0;
+
+    this.createSocketErrorCount = 0;
+    this.createSocketErrorCountLastCheck = 0;
+
+    this.closeSocketCount = 0;
+    this.closeSocketCountLastCheck = 0;
+
+    // socket error event count
+    this.errorSocketCount = 0;
+    this.errorSocketCountLastCheck = 0;
+
+    this.requestCount = 0;
+    this.requestCountLastCheck = 0;
+
+    this.timeoutSocketCount = 0;
+    this.timeoutSocketCountLastCheck = 0;
+
+    this.on('free', s => {
+      this.requestCount++;
+      // last enter free queue timestamp
+      s.lastFreeTime = Date.now();
+    });
+    this.on('timeout', () => {
+      this.timeoutSocketCount++;
+    });
+    this.on('close', () => {
+      this.closeSocketCount++;
+    });
+    this.on('error', () => {
+      this.errorSocketCount++;
+    });
+  }
+
+  createSocket(req, options, cb) {
+    super.createSocket(req, options, (err, socket) => {
+      if (err) {
+        this.createSocketErrorCount++;
+        return cb(err);
+      }
+      if (this.keepAlive) {
+        // Disable Nagle's algorithm: http://blog.caustik.com/2012/04/08/scaling-node-js-to-100k-concurrent-connections/
+        // https://fengmk2.com/benchmark/nagle-algorithm-delayed-ack-mock.html
+        socket.setNoDelay(true);
+      }
+      this.createSocketCount++;
+      cb(null, socket);
+    });
+  }
+
+  get statusChanged() {
+    const changed = this.createSocketCount !== this.createSocketCountLastCheck ||
+      this.createSocketErrorCount !== this.createSocketErrorCountLastCheck ||
+      this.closeSocketCount !== this.closeSocketCountLastCheck ||
+      this.errorSocketCount !== this.errorSocketCountLastCheck ||
+      this.timeoutSocketCount !== this.timeoutSocketCountLastCheck ||
+      this.requestCount !== this.requestCountLastCheck;
+    if (changed) {
+      this.createSocketCountLastCheck = this.createSocketCount;
+      this.createSocketErrorCountLastCheck = this.createSocketErrorCount;
+      this.closeSocketCountLastCheck = this.closeSocketCount;
+      this.errorSocketCountLastCheck = this.errorSocketCount;
+      this.timeoutSocketCountLastCheck = this.timeoutSocketCount;
+      this.requestCountLastCheck = this.requestCount;
+    }
+    return changed;
+  }
+
+  getCurrentStatus() {
+    return {
+      createSocketCount: this.createSocketCount,
+      createSocketErrorCount: this.createSocketErrorCount,
+      closeSocketCount: this.closeSocketCount,
+      errorSocketCount: this.errorSocketCount,
+      timeoutSocketCount: this.timeoutSocketCount,
+      requestCount: this.requestCount,
+      freeSockets: inspect(this.freeSockets),
+      sockets: inspect(this.sockets),
+      requests: inspect(this.requests),
+    };
+  }
+}
+
+module.exports = Agent;
+
+function inspect(obj) {
+  const res = {};
+  for (const key in obj) {
+    res[key] = obj[key].length;
+  }
+  return res;
+}

+ 42 - 0
node_modules/agentkeepalive/lib/https_agent.js

@@ -0,0 +1,42 @@
+/**
+ * Https Agent base on custom http agent
+ */
+
+'use strict';
+
+const https = require('https');
+const HttpAgent = require('./agent');
+const OriginalHttpsAgent = https.Agent;
+
+class HttpsAgent extends HttpAgent {
+  constructor(options) {
+    super(options);
+
+    this.defaultPort = 443;
+    this.protocol = 'https:';
+    this.maxCachedSessions = this.options.maxCachedSessions;
+    if (this.maxCachedSessions === undefined) {
+      this.maxCachedSessions = 100;
+    }
+
+    this._sessionCache = {
+      map: {},
+      list: [],
+    };
+  }
+}
+
+[
+  'createConnection',
+  'getName',
+  '_getSession',
+  '_cacheSession',
+  // https://github.com/nodejs/node/pull/4982
+  '_evictSession',
+].forEach(function(method) {
+  if (typeof OriginalHttpsAgent.prototype[method] === 'function') {
+    HttpsAgent.prototype[method] = OriginalHttpsAgent.prototype[method];
+  }
+});
+
+module.exports = HttpsAgent;

+ 83 - 0
node_modules/agentkeepalive/package.json

@@ -0,0 +1,83 @@
+{
+  "_from": "agentkeepalive@^3.4.1",
+  "_id": "agentkeepalive@3.5.2",
+  "_inBundle": false,
+  "_integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==",
+  "_location": "/agentkeepalive",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "agentkeepalive@^3.4.1",
+    "name": "agentkeepalive",
+    "escapedName": "agentkeepalive",
+    "rawSpec": "^3.4.1",
+    "saveSpec": null,
+    "fetchSpec": "^3.4.1"
+  },
+  "_requiredBy": [
+    "/ali-oss"
+  ],
+  "_resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz",
+  "_shasum": "a113924dd3fa24a0bc3b78108c450c2abee00f67",
+  "_spec": "agentkeepalive@^3.4.1",
+  "_where": "D:\\2022\\3\\Mazui\\node_modules\\ali-oss",
+  "author": {
+    "name": "fengmk2",
+    "email": "fengmk2@gmail.com",
+    "url": "https://fengmk2.com"
+  },
+  "browser": "browser.js",
+  "bugs": {
+    "url": "https://github.com/node-modules/agentkeepalive/issues"
+  },
+  "bundleDependencies": false,
+  "ci": {
+    "version": "4, 6, 8, 10"
+  },
+  "dependencies": {
+    "humanize-ms": "^1.2.1"
+  },
+  "deprecated": false,
+  "description": "Missing keepalive http.Agent",
+  "devDependencies": {
+    "autod": "^3.0.1",
+    "egg-bin": "^1.11.1",
+    "egg-ci": "^1.8.0",
+    "eslint": "^4.19.1",
+    "eslint-config-egg": "^6.0.0",
+    "pedding": "^1.1.0"
+  },
+  "engines": {
+    "node": ">= 4.0.0"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts",
+    "browser.js",
+    "lib"
+  ],
+  "homepage": "https://github.com/node-modules/agentkeepalive#readme",
+  "keywords": [
+    "http",
+    "https",
+    "agent",
+    "keepalive",
+    "agentkeepalive"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "agentkeepalive",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/node-modules/agentkeepalive.git"
+  },
+  "scripts": {
+    "autod": "autod",
+    "ci": "npm run lint && npm run cov",
+    "cov": "egg-bin cov",
+    "lint": "eslint lib test index.js",
+    "test": "egg-bin test"
+  },
+  "version": "3.5.2"
+}

+ 21 - 0
node_modules/ali-oss/LICENSE

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) ali-sdk and other contributors.
+
+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, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 4449 - 0
node_modules/ali-oss/README.md

@@ -0,0 +1,4449 @@
+oss-js-sdk
+=======
+
+[![NPM version][npm-image]][npm-url]
+[![build status][travis-image]][travis-url]
+[![coverage][cov-image]][cov-url]
+[![David deps][david-image]][david-url]
+
+[npm-image]: https://img.shields.io/npm/v/ali-oss.svg?style=flat-square
+[npm-url]: https://npmjs.org/package/ali-oss
+[travis-image]: https://img.shields.io/travis/ali-sdk/ali-oss/master.svg?style=flat-square
+[travis-url]: https://travis-ci.org/ali-sdk/ali-oss.svg?branch=master
+[cov-image]: http://codecov.io/github/ali-sdk/ali-oss/coverage.svg?branch=master
+[cov-url]: http://codecov.io/github/ali-sdk/ali-oss?branch=master
+[david-image]: https://img.shields.io/david/ali-sdk/ali-oss.svg?style=flat-square
+[david-url]: https://david-dm.org/ali-sdk/ali-oss
+
+aliyun OSS(Object Storage Service) js client for Node and Browser env.
+
+`NOTE`: For SDK `5.X` document, please go to [README.md](https://github.com/ali-sdk/ali-oss/blob/5.x/README.md)
+
+## Install
+
+```bash
+npm install ali-oss --save
+```
+
+## Compatibility
+
+### Node
+Node.js >= 8.0.0 required. You can use 4.x in Node.js < 8.
+
+### Browser
+
+- IE >= 10 & Edge
+- Major versions of Chrome/Firefox/Safari
+- Major versions of Android/iOS/WP
+
+`Note`:
+- For Lower browsers you can refer to [PostObject](https://help.aliyun.com/document_detail/31988.html), if you want to see more practices ,please refer to [Web Post](https://help.aliyun.com/document_detail/31923.html)
+
+### QA
+You can join DingDing Talk Group, [Group Link](https://qr.dingtalk.com/action/joingroup?code=v1,k1,inkSDqCxm7LilkaR/kknRVBDQ8PDA0Lj5hj4Cf9io3w=&_dt_no_comment=1&origin=11)
+
+<img src="task/dingding.jpg" height="400" title="dingding" width="300">
+
+## License
+
+[MIT](LICENSE)
+
+# OSS Usage
+
+OSS, Object Storage Service. Equal to well known Amazon [S3](http://aws.amazon.com/s3/).
+
+All operation use es7 async/await to implement. All api is async function.
+
+## Summary
+
+- [Node Usage](#node-usage)
+- [Browser Usage](#browser-usage)
+- [Data Regions](#data-regions)
+- [Create Account](#create-account)
+- [Create A Bucket Instance](#create-a-bucket-instance)
+  - [oss(options)](#ossoptions)
+- [Bucket Operations](#bucket-operations)
+  - Base
+    - [.listBuckets(query[, options])](#listbucketsquery-options)
+    - [.putBucket(name[, options])](#putbucketname-options)
+    - [.useBucket(name)](#usebucketname)
+    - [.deleteBucket(name[, options])](#deletebucketname-options)
+    - [.getBucketInfo(name)](#getbucketinfoname)
+    - [.getBucketLocation(name)](#getbucketlocationname)
+  - ACL
+    - [.putBucketACL(name, acl[, options])](#putbucketaclname-acl-options)
+    - [.getBucketACL(name[, options])](#getbucketaclname-options)
+  - Logging
+    - [.putBucketLogging(name, prefix[, options])](#putbucketloggingname-prefix-options)
+    - [.getBucketLogging(name[, options])](#getbucketloggingname-options)
+    - [.deleteBucketLogging(name[, options])](#deletebucketloggingname-options)
+  - Website
+    - [.putBucketWebsite(name, config[, options])](#putbucketwebsitename-config-options)
+    - [.getBucketWebsite(name[, options])](#getbucketwebsitename-options)
+    - [.deleteBucketWebsite(name, region[, options])](#deletebucketwebsitename-options)
+  - Referer
+    - [.putBucketReferer(name, allowEmpty, referers[, options])](#putbucketreferername-allowempty-referers-options)
+    - [.getBucketReferer(name[, options])](#getbucketreferername-options)
+    - [.deleteBucketReferer(name[, options])](#deletebucketreferername-options)
+  - Lifecycle
+    - [.putBucketLifecycle(name, rules[, options])](#putbucketlifecyclename-rules-options)
+    - [.getBucketLifecycle(name[, options])](#getbucketlifecyclename-options)
+    - [.deleteBucketLifecycle(name[, options])](#deletebucketlifecyclename-options)
+  - CORS
+    - [.putBucketCORS(name, rules[, options])](#putbucketcorsname-rules-options)
+    - [.getBucketCORS(name[, options])](#getbucketcorsname-options)
+    - [.deleteBucketCORS(name[, options])](#deletebucketcorsname-options)
+  - RequestPayment
+    - [.getBucketRequestPayment(bucketName[, options])](#getbucketrequestpaymentbucketname-options)
+    - [.putBucketRequestPayment(bucketName, payer[, options])](#putBucketRequestpaymentbucketname-payer-options)
+  - BucketEncryption
+    - [.putBucketEncryption(name[, rules])](#putbucketencryptionname-rules)
+    - [.getBucketEncryption(name)](#getbucketencryptionname)
+    - [.deleteBucketEncryption(name)](#deletebucketencryptionname)
+  - tagging
+    - [.putBucketTags(name, tag[, options])](#putBucketTagsname-tag-options)
+    - [.getBucketTags(name, [, options])](#getBucketTagsname-options)
+    - [.deleteBucketTags(name, [, options])](#deleteBucketTagsname-options)
+  - policy
+    - [.putBucketPolicy(name, policy[, options])](#putBucketPolicyname-policy-options)
+    - [.getBucketPolicy(name, [, options])](#getBucketPolicyname-options)
+    - [.deleteBucketPolicy(name, [, options])](#deleteBucketPolicyname-options)
+  - versioning
+    - [.getBucketVersioning(name, [, options])](#getBucketVersioningname-options)
+    - [.putBucketVersioning(name, status[, options])](#putBucketVersioningname-status-options)
+  - inventory
+      - [.getBucketInventory(name, inventoryId[, options])](#getBucketInventoryname-inventoryid-options)
+      - [.putBucketInventory(name, inventory[, options])](#putBucketInventoryname-inventory-options)
+      - [.deleteBucketInventory(name, inventoryId[, options])](#deleteBucketInventoryname-inventoryid-options)
+      - [.listBucketInventory(name, [, options])](#listBucketInventoryname-options)
+  - worm
+    - [.abortBucketWorm(name[, options])](#abortBucketWormname-options)
+    - [.completeBucketWorm(name, wormId[, options])](#completeBucketWormname-wormId-options)
+    - [.extendBucketWorm(name, wormId, days[, options])](#extendBucketWormname-wormId-days-options)
+    - [.getBucketWorm(name[, options])](#getBucketWormname-options)
+    - [.initiateBucketWorm(name, days[, options])](#initiateBucketWormname-days-options)
+
+- [Object Operations](#object-operations)
+  - [.list(query[, options])](#listquery-options)
+  - [.listV2(query[, options])](#listV2query-options)
+  - [.getBucketVersions(query[, options])](#getBucketVersionsquery-options)
+  - [.put(name, file[, options])](#putname-file-options)
+  - [.putStream(name, stream[, options])](#putstreamname-stream-options)
+  - [.append(name, file[, options])](#appendname-file-options)
+  - [.getObjectUrl(name[, baseUrl])](#getobjecturlname-baseurl)
+  - [.generateObjectUrl(name[, baseUrl])](#generateobjecturlname-baseurl)
+  - [.head(name[, options])](#headname-options)
+  - [.getObjectMeta(name[, options])](#getobjectmetaname-options)
+  - [.get(name[, file, options])](#getname-file-options)
+  - [.getStream(name[, options])](#getstreamname-options)
+  - [.delete(name[, options])](#deletename-options)
+  - [.copy(name, sourceName[, sourceBucket, options])](#copyname-sourcename-sourcebucket-options)
+  - [.putMeta(name, meta[, options])](#putmetaname-meta-options)
+  - [.deleteMulti(names[, options])](#deletemultinames-options)
+  - [.signatureUrl(name[, options])](#signatureurlname-options)
+  - [.putACL(name, acl[, options])](#putaclname-acl-options)
+  - [.getACL(name[, options])](#getaclname-options)
+  - [.restore(name[, options])](#restorename-options)
+  - [.putSymlink(name, targetName[, options])](#putsymlinkname-targetname-options)
+  - [.getSymlink(name[, options])](#getsymlinkname-options)
+  - [.initMultipartUpload(name[, options])](#initmultipartuploadname-options)
+  - [.uploadPart(name, uploadId, partNo, file, start, end[, options])](#uploadpartname-uploadid-partno-file-start-end-options)
+  - [.uploadPartCopy(name, uploadId, partNo, range, sourceData[, options])](#uploadpartcopyname-uploadid-partno-range-sourcedata-options)
+  - [.completeMultipartUpload(name, uploadId, parts[, options])](#completemultipartuploadname-uploadid-parts-options)
+  - [.multipartUpload(name, file[, options])](#multipartuploadname-file-options)
+  - [.multipartUploadCopy(name, sourceData[, options])](#multipartuploadcopyname-sourcedata-options)
+  - [.listParts(name, uploadId[, query, options])](#listpartsname-uploadid-query-options)
+  - [.listUploads(query[, options])](#listuploadsquery-options)
+  - [.abortMultipartUpload(name, uploadId[, options])](#abortmultipartuploadname-uploadid-options)
+  - [.calculatePostSignature(policy)](#calculatePostSignaturepolicy)
+  - [.getObjectTagging(name, [, options])](#getObjectTaggingname-options)
+  - [.putObjectTagging(name, tag[, options])](#putObjectTaggingname-tag-options)
+  - [.deleteObjectTagging(name, [, options])](#deleteObjectTaggingname-options)
+- [RTMP Operations](#rtmp-operations)
+  - [.putChannel(id, conf[, options])](#putchannelid-conf-options)
+  - [.getChannel(id[, options])](#getchannelid-options)
+  - [.deleteChannel(id[, options])](#deletechannelid-options)
+  - [.putChannelStatus(id, status[, options])](#putchannelstatusid-status-options)
+  - [.getChannelStatus(id[, options])](#getchannelstatusid-options)
+  - [.listChannels(query[, options])](#listchannelsquery-options)
+  - [.getChannelHistory(id[, options])](#getchannelhistoryid-options)
+  - [.createVod(id, name, time[, options])](#createvodid-name-time-options)
+  - [.getRtmpUrl(channelId[, options])](#getrtmpurlchannelid-options)
+- [Create A Image Service Instance](#create-a-image-service-instance)
+  - [oss.ImageClient(options)](#ossimageclientoptions)
+- [Image Operations](#image-operations)
+  - [imgClient.get(name, file[, options])](#imgclientgetname-file-options)
+  - [imgClient.getStream(name[, options])](#imgclientgetstreamname-options)
+  - [imgClient.getExif(name[, options])](#imgclientgetexifname-options)
+  - [imgClient.getInfo(name[, options])](#imgclientgetinfoname-options)
+  - [imgClient.putStyle(name, style[, options])](#imgclientputstylename-style-options)
+  - [imgClient.getStyle(name[, options])](#imgclientgetstylename-options)
+  - [imgClient.listStyle([options])](#imgclientliststyleoptions)
+  - [imgClient.deleteStyle(name[, options])](#imgclientdeletestylename-options)
+  - [imgClient.signatureUrl(name)](#imgclientsignatureurlname)
+- [Known Errors](#known-errors)
+
+## Node Usage
+
+### Compatibility
+- Node: >= 8.0.0
+
+### Basic usage
+1.install SDK using npm
+```
+npm install ali-oss --save
+```
+2.for example:
+```js
+const OSS = require('ali-oss');
+const client = new OSS({
+  region: '<oss region>',
+  accessKeyId: '<Your accessKeyId>',
+  accessKeySecret: '<Your accessKeySecret>',
+  bucket: '<Your bucket name>'
+});
+```
+## Browser Usage
+
+You can use most of the functionalities of `ali-oss` in browser with
+some exceptions:
+
+- put object with streaming: no chunked encoding, we use multipart
+  upload instead
+- get object to local file: we cannot manipulate file system in
+  browser, we provide signed object url for downloading needs
+- bucket operations(listBuckets, putBucketLogging, etc) will fail: OSS
+  server currently do not support CORS requests for bucket operations
+  (will probably be fixed later)
+
+### Compatibility
+
+- IE >= 10 & Edge
+- Major versions of Chrome/Firefox/Safari
+- Major versions of Android/iOS/WP
+    >Note: Because some browsers do not support promises, you need to introduce promise compatible libraries.<br>
+    For example: IE10 and IE11 need to introduce a promise-polyfill.
+
+### Setup
+
+#### Bucket setup
+
+As browser-side javascript involves CORS operations. You need to setup
+your bucket CORS rules to allow CORS operations:
+
+- set allowed origins to '\*'
+- allowed methods to 'PUT, GET, POST, DELETE, HEAD'
+- set allowed headers to '\*'
+- expose 'ETag' in expose headers
+
+#### STS setup
+
+As we don't want to expose the accessKeyId/accessKeySecret in the
+browser, a [common practice][oss-sts] is to use STS to grant temporary
+access.
+
+### Basic usage
+
+Include the sdk lib in the `<script>` tag and you have `OSS` available
+for creating client.
+
+```html
+ // x.x.x The specific version number represented
+ // we recommend introducing offline resources, because the usability of online resources depends on the stability of the cdn server.
+ <!-- Introducing online resources -->
+ <script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-x.x.x.min.js"></script>
+ <!-- Introducing offline resources -->
+ <script src="./aliyun-oss-sdk-x.x.x.min.js"></script>
+
+<script type="text/javascript">
+  const client = new OSS({
+    region: 'oss-cn-hangzhou',
+    accessKeyId: '<access-key-id>',
+    accessKeySecret: '<access-key-secret>',
+    bucket: '<bucket-name>',
+    stsToken: '<security-token>'
+  });
+
+  client.list().then((result) => {
+    console.log('objects: %j', result.objects);
+    return client.put('my-obj', new OSS.Buffer('hello world'));
+  }).then((result) => {
+    console.log('put result: %j', result);
+    return client.get('my-obj');
+  }).then((result) => {
+    console.log('get result: %j', result.content.toString());
+  });
+</script>
+```
+The full sample can be found [here][browser-sample].
+
+### How to build
+
+```bash
+npm run build-dist
+```
+
+And see the build artifacts under `dist/`.
+
+
+## Data Regions
+
+[OSS current data regions](https://help.aliyun.com/document_detail/31837.html).
+
+region | country | city | endpoint | internal endpoint
+---  | ---     | ---  | --- | ---
+oss-cn-hangzhou | China | HangZhou | oss-cn-hangzhou.aliyuncs.com | oss-cn-hangzhou-internal.aliyuncs.com
+oss-cn-shanghai | China | ShangHai | oss-cn-shanghai.aliyuncs.com | oss-cn-shanghai-internal.aliyuncs.com
+oss-cn-qingdao | China | QingDao | oss-cn-qingdao.aliyuncs.com | oss-cn-qingdao-internal.aliyuncs.com
+oss-cn-beijing | China | BeiJing | oss-cn-beijing.aliyuncs.com | oss-cn-beijing-internal.aliyuncs.com
+oss-cn-shenzhen | China | ShenZhen | oss-cn-shenzhen.aliyuncs.com | oss-cn-shenzhen-internal.aliyuncs.com
+oss-cn-hongkong | China | HongKong | oss-cn-hongkong.aliyuncs.com | oss-cn-hongkong-internal.aliyuncs.com
+oss-us-west-1 | US | Silicon Valley | oss-us-west-1.aliyuncs.com | oss-us-west-1-internal.aliyuncs.com
+oss-ap-southeast-1 | Singapore | Singapore | oss-ap-southeast-1.aliyuncs.com | oss-ap-southeast-1-internal.aliyuncs.com
+
+## Create Account
+
+Go to [OSS website](http://www.aliyun.com/product/oss/?lang=en), create a new account for new user.
+
+After account created, you can create the OSS instance and get the `accessKeyId` and `accessKeySecret`.
+
+## Create A Bucket Instance
+
+Each OSS instance required `accessKeyId`, `accessKeySecret` and `bucket`.
+
+## oss(options)
+
+Create a Bucket store instance.
+
+options:
+
+- accessKeyId {String} access key you create on aliyun console website
+- accessKeySecret {String} access secret you create
+- [stsToken] {String} used by temporary authorization, detail [see](https://www.alibabacloud.com/help/doc-detail/32077.htm)
+- [refreshSTSToken] {Function} used by auto set `stsToken`、`accessKeyId`、`accessKeySecret` when sts info expires. return value must be object contains `stsToken`、`accessKeyId`、`accessKeySecret`
+- [refreshSTSTokenInterval] {number} use time (ms) of refresh STSToken interval it should be
+  less than sts info expire interval, default is 300000ms(5min)
+  when sts info expires. return value must be object contains `stsToken`、`accessKeyId`、`accessKeySecret`
+- [bucket] {String} the default bucket you want to access
+  If you don't have any bucket, please use `putBucket()` create one first.
+- [endpoint] {String} oss region domain. It takes priority over `region`. Set as extranet domain name, intranet domain name, accelerated domain name, etc. according to different needs. please see [endpoints](https://www.alibabacloud.com/help/doc-detail/31837.htm)
+- [region] {String} the bucket data region location, please see [Data Regions](#data-regions),
+  default is `oss-cn-hangzhou`.
+- [internal] {Boolean} access OSS with aliyun internal network or not, default is `false`.
+  If your servers are running on aliyun too, you can set `true` to save lot of money.
+- [secure] {Boolean} instruct OSS client to use HTTPS (secure: true) or HTTP (secure: false) protocol.
+- [timeout] {String|Number} instance level timeout for all operations, default is `60s`.
+- [cname] {Boolean}, default false, access oss with custom domain name. if true, you can fill `endpoint` field with your custom domain name,
+- [isRequestPay] {Boolean}, default false, whether request payer function of the bucket is open, if true, will send headers `'x-oss-request-payer': 'requester'` to oss server.
+  the details you can see [requestPay](https://help.aliyun.com/document_detail/91337.htm)
+- [useFetch] {Boolean}, default false, it just work in Browser, if true,it means upload object with
+`fetch` mode ,else `XMLHttpRequest`
+- [enableProxy] {Boolean}, Enable proxy request, default is false.
+- [proxy] {String | Object}, proxy agent uri or options, default is null.
+- [retryMax] {Number}, used by auto retry send request count when request error is net error or timeout.  **_NOTE:_**  Not support `put` with stream, `putStream`, `append` with stream because the stream can only be consumed once
+- [maxSockets] {Number} Maximum number of sockets to allow per host. Default is infinity
+
+example:
+
+1. basic usage
+```js
+const OSS = require('ali-oss');
+
+const store = new OSS({
+  accessKeyId: 'your access key',
+  accessKeySecret: 'your access secret',
+  bucket: 'your bucket name',
+  region: 'oss-cn-hangzhou'
+});
+```
+2. use accelerate endpoint
+- Global accelerate endpoint: oss-accelerate.aliyuncs.com
+- Accelerate endpoint of regions outside mainland China: oss-accelerate-overseas.aliyuncs.com
+```js
+const OSS = require('ali-oss');
+
+const store = new OSS({
+  accessKeyId: 'your access key',
+  accessKeySecret: 'your access secret',
+  bucket: 'your bucket name',
+  endpoint: 'oss-accelerate.aliyuncs.com',
+});
+```
+
+3. use custom domain
+```js
+const OSS = require('ali-oss');
+
+const store = new OSS({
+  accessKeyId: 'your access key',
+  accessKeySecret: 'your access secret',
+  cname: true,
+  endpoint: 'your custome domain',
+});
+```
+
+4. use STS and refreshSTSToken
+```js
+const OSS = require('ali-oss');
+
+const store = new OSS({
+  accessKeyId: 'your STS key',
+  accessKeySecret: 'your STS secret',
+  stsToken: 'your STS token',
+  refreshSTSToken: async () => {
+    const info = await fetch('you sts server');
+    return {
+      accessKeyId: info.accessKeyId,
+      accessKeySecret: info.accessKeySecret,
+      stsToken: info.stsToken
+    }
+  },
+  refreshSTSTokenInterval: 300000
+});
+```
+
+5. retry request with stream
+```js
+for (let i = 0; i <= store.options.retryMax; i++) {
+  try {
+    const result = await store.putStream("<example-object>", fs.createReadStream("<example-path>"));
+    console.log(result);
+    break; // break if success
+  } catch (e) {
+    console.log(e);
+  }
+}
+```
+
+## Bucket Operations
+
+### .listBuckets(query[, options])
+
+List buckets in this account.
+
+parameters:
+
+- [query] {Object} query parameters, default is `null`
+  - [prefix] {String} search buckets using `prefix` key
+  - [marker] {String} search start from `marker`, including `marker` key
+  - [max-keys] {String|Number} max buckets, default is `100`, limit to `1000`
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return buckets list on `buckets` properties.
+
+- buckets {Array<BucketMeta>} bucket meta info list
+  Each `BucketMeta` will contains blow properties:
+    - name {String} bucket name
+    - region {String} bucket store data region, e.g.: `oss-cn-hangzhou-a`
+    - creationDate {String} bucket create GMT date, e.g.: `2015-02-19T08:39:44.000Z`
+    - storageClass {String} e.g.: `Standard`, `IA`, `Archive`
+- owner {Object} object owner, including `id` and `displayName`
+- isTruncated {Boolean} truncate or not
+- nextMarker {String} next marker string
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- List top 10 buckets
+
+```js
+store.listBuckets({
+  "max-keys": 10
+}).then((result) => {
+  console.log(result);
+});
+
+```
+
+### .putBucket(name[, options])
+
+Create a new bucket.
+
+parameters:
+
+- name {String} bucket name
+  If bucket exists and not belong to current account, will throw BucketAlreadyExistsError.
+  If bucket not exists, will create a new bucket and set it's ACL.
+- [options] {Object} optional parameters
+  - [acl] {String} include `private`,`public-read`,`public-read-write`
+  - [storageClass] {String} the storage type include (Standard,IA,Archive)
+  - [dataRedundancyType] {String} default `LRS`, include `LRS`,`ZRS`
+  - [timeout] {Number} the operation timeout
+
+Success will return the bucket name on `bucket` properties.
+
+- bucket {String} bucket name
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Create a bucket name `helloworld` location on HongKong
+
+```js
+store.putBucket('helloworld').then((result) => {
+  // use it by default
+  store.useBucket('helloworld');
+});
+```
+
+- Create a bucket name `helloworld` location on HongKong StorageClass `Archive`
+
+```js
+await store.putBucket('helloworld', { StorageClass: 'Archive' });
+// use it by default
+store.useBucket('helloworld');
+```
+
+### .deleteBucket(name[, options])
+
+Delete an empty bucket.
+
+parameters:
+
+- name {String} bucket name
+  If bucket is not empty, will throw BucketNotEmptyError.
+  If bucket is not exists, will throw NoSuchBucketError.
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Delete the exists 'helloworld' bucket on 'oss-cn-hongkong'
+
+```js
+store.deleteBucket('helloworld').then((result) => {});
+```
+
+### .useBucket(name)
+
+Use the bucket.
+
+parameters:
+
+- name {String} bucket name
+
+example:
+
+- Use `helloworld` as the default bucket
+
+```js
+store.useBucket('helloworld');
+```
+
+### .getBucketInfo(name)
+
+Get bucket information,include CreationDate、ExtranetEndpoint、IntranetEndpoint、Location、Name、StorageClass、
+Owner、AccessControlList、Versioning
+
+parameters:
+
+- name {String} bucket name
+
+example:
+
+- Use `helloworld` as the default bucket
+
+```js
+store.getBucketInfo('helloworld').then( (res) => {
+  console.log(res.bucket)
+})
+```
+
+### .getBucketLocation(name)
+
+Get bucket location
+
+parameters:
+
+- name {String} bucket name
+
+example:
+
+- Use `helloworld` as the default bucket
+
+```js
+store.getBucketLocation('helloworld').then( (res) => {
+  console.log(res.location)
+})
+```
+
+---
+
+### .putBucketACL(name, acl[, options])
+
+Update the bucket ACL.
+
+parameters:
+
+- name {String} bucket name
+- acl {String} access control list, current available: `public-read-write`, `public-read` and `private`
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Set bucket `helloworld` to `public-read-write`
+
+```js
+store.putBucketACL('helloworld', 'public-read-write').then((result) => {
+});
+```
+
+### .getBucketACL(name[, options])
+
+Get the bucket ACL.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- acl {String} acl settiongs string
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Get bucket `helloworld`
+
+```js
+store.getBucketACL('helloworld').then((result) => {
+  console.log(result.acl);
+});
+```
+
+---
+
+### .putBucketLogging(name, prefix[, options])
+
+Update the bucket logging settings.
+Log file will create every one hour and name format: `<prefix><bucket>-YYYY-mm-DD-HH-MM-SS-UniqueString`.
+
+parameters:
+
+- name {String} bucket name
+- [prefix] {String} prefix path name to store the log files
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Enable bucket `helloworld` logging and save with prefix `logs/`
+
+```js
+store.putBucketLogging('helloworld', 'logs/').then((result) => {
+});
+```
+
+### .getBucketLogging(name[, options])
+
+Get the bucket logging settings.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- enable {Boolean} enable logging or not
+- prefix {String} prefix path name to store the log files, maybe `null`
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Get bucket `helloworld` logging settings
+
+```js
+store.getBucketLogging('helloworld').then((result) => {
+  console.log(result.enable, result.prefix);
+});
+```
+
+### .deleteBucketLogging(name[, options])
+
+Delete the bucket logging settings.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+---
+
+### .putBucketWebsite(name, config[, options])
+
+Set the bucket as a static website.
+
+parameters:
+
+- name {String} bucket name
+- config {Object} website config, contains blow properties:
+  - index {String} default page, e.g.: `index.html`
+  - [error] {String} error page, e.g.: 'error.html'
+  - [supportSubDir] {String} default vaule false
+  - [type] {String} default value 0
+  - [routingRules] {Array} RoutingRules
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+```js
+store.putBucketWebsite('hello', {
+  index: 'index.html'
+}).then((result) => {
+});
+```
+
+### .getBucketWebsite(name[, options])
+
+Get the bucket website config.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- index {String} index page
+- error {String} error page, maybe `null`
+- supportSubDir {String}
+- type {String}
+- routingRules {Array}
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+### .deleteBucketWebsite(name[, options])
+
+Delete the bucket website config.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+---
+
+### .putBucketReferer(name, allowEmpty, referers[, options])
+
+Set the bucket request `Referer` white list.
+
+parameters:
+
+- name {String} bucket name
+- allowEmpty {Boolean} allow empty request referer or not
+- referers {Array<String>} `Referer` white list, e.g.:
+  ```js
+  [
+    'https://npm.taobao.org',
+    'http://cnpmjs.org'
+  ]
+  ```
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+```js
+store.putBucketReferer('hello', false, [
+  'https://npm.taobao.org',
+  'http://cnpmjs.org'
+]).then((result) => {
+});
+```
+
+### .getBucketReferer(name[, options])
+
+Get the bucket request `Referer` white list.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- allowEmpty {Boolean} allow empty request referer or not
+- referers {Array<String>} `Referer` white list
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+### .deleteBucketReferer(name[, options])
+
+Delete the bucket request `Referer` white list.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+---
+
+### .putBucketLifecycle(name, rules[, options])
+
+Set the bucket object lifecycle.
+
+parameters:
+
+- name {String} bucket name
+- rules {Array<Rule>} rule config list, each `Rule` will contains blow properties:
+  - [id] {String} rule id, if not set, OSS will auto create it with random string.
+  - prefix {String} store prefix
+  - status {String} rule status, allow values: `Enabled` or `Disabled`
+  - [expiration] {Object} specifies the expiration attribute of the lifecycle rules for the object.
+    - [days] {Number|String} expire after the `days`
+    - [createdBeforeDate] {String} expire date, e.g.: `2022-10-11T00:00:00.000Z`
+    - [expiredObjectDeleteMarker] {String} value `true`
+    `createdBeforeDate` and `days`  and `expiredObjectDeleteMarker` must have one.
+  - [abortMultipartUpload] {Object} Specifies the expiration attribute of the multipart upload tasks that are not complete.
+    - [days] {Number|String} expire after the `days`
+    - [createdBeforeDate] {String} expire date, e.g.: `2022-10-11T00:00:00.000Z`
+    `createdBeforeDate` and `days` must have one.
+  - [transition] {Object} Specifies the time when an object is converted to the IA or archive storage class during a valid life cycle.
+    - storageClass {String} Specifies the storage class that objects that conform to the rule are converted into. allow values: `IA` or `Archive`
+    - [days] {Number|String} expire after the `days`
+    - [createdBeforeDate] {String} expire date, e.g.: `2022-10-11T00:00:00.000Z`
+    `createdBeforeDate` and `days` must have one.
+  - [noncurrentVersionTransition] {Object} Specifies the time when an object is converted to the IA or archive storage class during a valid life cycle.
+    - storageClass {String} Specifies the storage class that history objects that conform to the rule are converted into. allow values: `IA` or `Archive`
+    - noncurrentDays {String} expire after the `noncurrentDays`
+  `expiration`、 `abortMultipartUpload`、 `transition`、 `noncurrentVersionTransition` must have one.
+  - [noncurrentVersionExpiration] {Object} specifies the expiration attribute of the lifecycle rules for the history object.
+    - noncurrentDays {String} expire after the `noncurrentDays`
+  - [tag] {Object} Specifies the object tag applicable to a rule. Multiple tags are supported.
+    - key {String} Indicates the tag key.
+    - value {String} Indicates the tag value.
+    `tag` cannot be used with `abortMultipartUpload`
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+```js
+store.putBucketLifecycle('hello', [
+  {
+    id: 'delete after one day',
+    prefix: 'logs/',
+    status: 'Enabled',
+    days: 1
+  },
+  {
+    prefix: 'logs2/',
+    status: 'Disabled',
+    date: '2022-10-11T00:00:00.000Z'
+  }
+]).then((result) => {});
+```
+
+example: for history with noncurrentVersionExpiration
+
+```js
+ const result = await store.putBucketLifecycle(bucket, [{
+  id: 'expiration1',
+  prefix: 'logs/',
+  status: 'Enabled',
+  expiration: {
+    days: '1'
+  },
+  noncurrentVersionExpiration: {
+    noncurrentDays: '1'
+  }
+}]);
+console.log(result)
+```
+
+example: for history with expiredObjectDeleteMarker
+
+```js
+ const result = await store.putBucketLifecycle(bucket, [{
+  id: 'expiration1',
+  prefix: 'logs/',
+  status: 'Enabled',
+  expiration: {
+    expiredObjectDeleteMarker: 'true'
+  },
+  noncurrentVersionExpiration: {
+    noncurrentDays: '1'
+  }
+}]);
+console.log(result)
+```
+
+example: for history with noncurrentVersionTransition
+
+```js
+ const result = await store.putBucketLifecycle(bucket, [{
+  id: 'expiration1',
+  prefix: 'logs/',
+  status: 'Enabled',
+  noncurrentVersionTransition: {
+    noncurrentDays: '10',
+    storageClass: 'IA'
+  }
+}]);
+console.log(result)
+```
+
+### .getBucketLifecycle(name[, options])
+
+Get the bucket object lifecycle.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- rules {Array<Rule>} the lifecycle rule list
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+### .deleteBucketLifecycle(name[, options])
+
+Delete the bucket object lifecycle.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+---
+
+### .putBucketCORS(name, rules[, options])
+
+Set CORS rules of the bucket object
+
+parameters:
+
+- name {String} bucket name
+- rules {Array<Rule>} rule config list, each `Rule` will contains below properties:
+  - allowedOrigin {String/Array} configure for Access-Control-Allow-Origin header
+  - allowedMethod {String/Array} configure for Access-Control-Allow-Methods header
+  - [allowedHeader] {String/Array} configure for Access-Control-Allow-Headers header
+  - [exposeHeader] {String/Array} configure for Access-Control-Expose-Headers header
+  - [maxAgeSeconds] {String} configure for Access-Control-Max-Age header
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+```js
+store.putBucketCORS('hello', [
+  {
+    allowedOrigin: '*',
+    allowedMethod: [
+      'GET',
+      'HEAD',
+    ],
+  }
+]).then((result) => {});
+```
+
+### .getBucketCORS(name[, options])
+
+Get CORS rules of the bucket object.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- rules {Array<Rule>} the CORS rule list
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+### .deleteBucketCORS(name[, options])
+
+Delete CORS rules of the bucket object.
+
+parameters:
+
+- name {String} bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+### .getBucketRequestPayment(bucketName[, options])
+
+get RequestPayment value of the bucket object.
+
+parameters:
+
+- bucketName {String} bucket name
+- [options] {Object} optional parameters
+
+Success will return:
+
+- status {Number} response status
+- payer {String} payer, BucketOwner or Requester
+- res {Object} response info, including
+  - data {Buffer} xml
+
+---
+
+### .putBucketRequestPayment(bucketName, payer[, options])
+
+put RequestPayment value of the bucket object.
+
+parameters:
+
+- bucketName {String}
+- payer {String} payer
+- [options] {Object} optional parameters
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+
+### .putBucketEncryption(name, rules)
+
+put BucketEncryption value of the bucket object.
+
+parameters:
+
+- name {String} bucket name
+- [rules] {Object} parameters
+  - SSEAlgorithm {String} encryption type, expect AES256 or KMS
+  - {KMSMasterKeyID} {String} needed when encryption type is KMS
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+
+### .getBucketEncryption(name)
+
+get BucketEncryption rule value of the bucket object.
+
+parameters:
+
+- name {String} bucket name
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+- encryption {Object} rules
+  - SSEAlgorithm {String} encryption type, AES256 or KMS
+  - {KMSMasterKeyID} {String} will be return when encryption type is KMS
+
+---
+
+### .deleteBucketEncryption(name)
+
+delete BucketEncryption rule value of the bucket object.
+
+parameters:
+
+- name {String} bucket name
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+
+### .putBucketTags(name, tag[, options])
+
+Adds tags for a bucket or modify the tags for a bucket.
+
+parameters:
+
+- name {String} the object name
+- tag {Object} tag, eg. `{var1: value1,var2:value2}`
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+
+### .getBucketTags(name[, options])
+
+Obtains the tags for a bucket.
+
+parameters:
+
+- name {String} the object name
+- [options] {Object} optional args
+
+Success will return:
+
+- tag {Object} the tag of object
+- res {Object} response info
+
+---
+
+### .deleteBucketTags(name[, options])
+
+Deletes the tags added for a bucket.
+
+parameters:
+
+- name {String} the object name
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+
+### .putBucketPolicy(name, policy[, options])
+
+Adds or modify policy for a bucket.
+
+parameters:
+
+- name {String} the bucket name
+- policy {Object} bucket policy
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+example:
+```js
+const policy = {
+  Version: '1',
+  Statement: [
+    {
+      Action: ['oss:PutObject', 'oss:GetObject'],
+      Effect: 'Deny',
+      Principal: ['1234567890'],
+      Resource: ['acs:oss:*:1234567890:*/*']
+    }
+  ]
+};
+const result = await store.putBucketPolicy(bucket, policy);
+console.log(result);
+```
+---
+
+### .getBucketPolicy(name[, options])
+
+Obtains the policy for a bucket.
+
+parameters:
+
+- name {String} the bucket name
+- [options] {Object} optional args
+
+Success will return:
+
+- policy {Object} the policy of bucket, if not exist, the value is null
+- res {Object} response info
+- status {Number} response status
+
+---
+
+### .deleteBucketPolicy(name[, options])
+
+Deletes the policy added for a bucket.
+
+parameters:
+
+- name {String} the bucket name
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+### .getBucketVersioning(name[, options])
+
+Obtains the version status of an object
+
+parameters:
+
+- name {String} the bucket name
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- versionStatus {String | undefined} version status, `Suspended` or `Enabled`. default value: `undefined`
+- res {Object} response info
+
+---
+
+### .putBucketVersioning(name, status[, options])
+
+set the version status of an object
+
+parameters:
+
+- name {String} the bucket name
+- status {String} version status, allow values: `Enabled` or `Suspended`
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+
+
+### .getBucketInventory(name, inventoryId[, options])
+
+get bucket inventory by inventory-id
+
+parameters:
+
+- name {String} the bucket name
+- inventoryId {String} inventory-id
+- [options] {Object} optional args
+
+Success will return:
+
+- inventory {Inventory}
+- status {Number} response status
+- res {Object} response info
+
+```js
+async function getBucketInventoryById() {
+  try {
+    const result = await client.getBucketInventory('bucket', 'inventoryid');
+    console.log(result.inventory)
+  } catch (err) {
+    console.log(err)
+  }
+}
+
+getBucketInventoryById();
+```
+
+### putBucketInventory(name, inventory[, options])
+
+set bucket inventory
+
+parameters:
+
+- name {String} the bucket name
+- inventory {Inventory} inventory config
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+```ts
+type Field = 'Size | LastModifiedDate | ETag | StorageClass | IsMultipartUploaded | EncryptionStatus';
+interface Inventory {
+  id: string;
+  isEnabled: true | false;
+  prefix?: string;
+  OSSBucketDestination: {
+    format: 'CSV';
+    accountId: string;
+    rolename: string;
+    bucket: string;
+    prefix?: string;
+    encryption?:
+    | {'SSE-OSS': ''}
+    | {
+      'SSE-KMS': {
+        keyId: string;
+      };
+    };
+  };
+  frequency: 'Daily' | 'Weekly';
+  includedObjectVersions: 'Current' | 'All';
+  optionalFields?: {
+    field?: Field[];
+  };
+}
+```
+```js
+const inventory = {
+  id: 'default',
+  isEnabled: false, // `true` | `false`
+  prefix: 'ttt', // filter prefix
+  OSSBucketDestination: {
+    format: 'CSV',
+    accountId: '1817184078010220',
+    rolename: 'AliyunOSSRole',
+    bucket: 'your bucket',
+    prefix: 'test',
+    //encryption: {'SSE-OSS': ''},
+    /*
+      encryption: {
+      'SSE-KMS': {
+        keyId: 'test-kms-id';
+      };,
+    */
+  },
+  frequency: 'Daily', // `WEEKLY` | `Daily`
+  includedObjectVersions: 'All', // `All` | `Current`
+  optionalFields: {
+    field: ["Size", "LastModifiedDate", "ETag", "StorageClass", "IsMultipartUploaded", "EncryptionStatus"]
+  },
+}
+
+async function putInventory(){
+  const bucket = 'Your Bucket Name';
+  try {
+    await client.putBucketInventory(bucket, inventory);
+  } catch(err) {
+    console.log(err);
+  }
+}
+
+putInventory()
+```
+
+### deleteBucketInventory(name, inventoryId[, options])
+
+delete bucket inventory by inventory-id
+
+parameters:
+
+- name {String} the bucket name
+- inventoryId {String} inventory-id
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+### listBucketInventory(name[, options])
+
+list bucket inventory
+
+parameters:
+
+- name {String} the bucket name
+- [options] {Object} optional args
+  - continuationToken used by search next page
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+example:
+
+```js
+async function listBucketInventory() {
+  const bucket = 'Your Bucket Name';
+  let nextContinuationToken;
+  // list all inventory of the bucket
+  do {
+    const result = await client.listBucketInventory(bucket, nextContinuationToken);
+    console.log(result.inventoryList);
+    nextContinuationToken = result.nextContinuationToken;
+  } while (nextContinuationToken)
+}
+
+listBucketInventory();
+```
+
+### .abortBucketWorm(name[, options])
+
+used to delete an unlocked retention policy.
+
+parameters:
+
+- name {String} the bucket name
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+
+### .completeBucketWorm(name, wormId[, options])
+
+used to lock a retention policy.
+
+parameters:
+
+- name {String} the bucket name
+- wormId {String} worm id
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+
+### .extendBucketWorm(name, wormId, days[, options])
+
+ used to extend the retention period of objects in a bucket whose retention policy is locked.
+
+parameters:
+
+- name {String} the bucket name
+- wormId {String} worm id
+- days {String | Number} retention days
+- [options] {Object} optional args
+
+Success will return:
+
+- status {Number} response status
+- res {Object} response info
+
+---
+
+### .getBucketWorm(name[, options])
+
+ used to query the retention policy information of the specified bucket.
+
+parameters:
+
+- name {String} the bucket name
+- [options] {Object} optional args
+
+Success will return:
+
+- wormId {String} worm id
+- state {String} `Locked` or `InProgress`
+- days {String} retention days
+- creationDate {String}
+- status {Number} response status
+- res {Object} response info
+
+---
+
+### .initiateBucketWorm(name, days[, options])
+
+create a retention policy.
+
+parameters:
+
+- name {String} the bucket name
+- days {String | Number}} set retention days
+- [options] {Object} optional args
+
+Success will return:
+
+- wormId {String} worm id
+- status {Number} response status
+- res {Object} response info
+
+---
+
+## Object Operations
+
+All operations function return Promise, except `signatureUrl`.
+
+### .put(name, file[, options])
+
+Add an object to the bucket.
+
+parameters:
+
+- name {String} object name store on OSS
+- file {String|Buffer|ReadStream|File(only support Browser)|Blob(only support Browser)} object local path, content buffer or ReadStream content instance use in Node, Blob and html5 File
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [mime] {String} custom mime, will send with `Content-Type` entity header
+  - [meta] {Object} user meta, will send with `x-oss-meta-` prefix string
+    e.g.: `{ uid: 123, pid: 110 }`
+  - [callback] {Object} The callback parameter is composed of a JSON string encoded in Base64,detail [see](https://www.alibabacloud.com/help/doc-detail/31989.htm)<br>
+    - url {String} After a file is uploaded successfully, the OSS sends a callback request to this URL.
+    - [host] {String} The host header value for initiating callback requests.
+    - body {String} The value of the request body when a callback is initiated, for example, key=$(key)&etag=$(etag)&my_var=$(x:my_var).
+    - [contentType] {String} The Content-Type of the callback requests initiatiated, It supports application/x-www-form-urlencoded and application/json, and the former is the default value.
+    - [customValue] {Object} Custom parameters are a map of key-values<br>
+         e.g.:
+        ```js
+           var customValue = {var1: 'value1', var2: 'value2'}
+        ```
+  - [headers] {Object} extra headers
+    - 'Cache-Control' cache control for download, e.g.: `Cache-Control: public, no-cache`
+    - 'Content-Disposition' object name for download, e.g.: `Content-Disposition: somename`
+    - 'Content-Encoding' object content encoding for download, e.g.: `Content-Encoding: gzip`
+    - 'Expires' expires time for download, an absolute date and time. e.g.: `Tue, 08 Dec 2020 13:49:43 GMT`
+    - See more: [PutObject](https://help.aliyun.com/document_detail/31978.html#title-yxe-96d-x61)
+  - [disabledMD5] {Boolean} default true, it just work in Browser. if false,it means that MD5 is automatically calculated for uploaded files. **_NOTE:_** Synchronous computing tasks will block the main process
+
+Success will return the object information.
+
+object:
+
+- name {String} object name
+- data {Object} callback server response data, sdk use JSON.parse() return
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Add an object through local file path
+
+```js
+const filepath = '/home/ossdemo/demo.txt';
+store.put('ossdemo/demo.txt', filepath).then((result) => {
+  console.log(result);
+});
+
+{
+  name: 'ossdemo/demo.txt',
+  res: {
+    status: 200,
+    headers: {
+      date: 'Tue, 17 Feb 2015 13:28:17 GMT',
+      'content-length': '0',
+      connection: 'close',
+      etag: '"BF7A03DA01440845BC5D487B369BC168"',
+      server: 'AliyunOSS',
+      'x-oss-request-id': '54E341F1707AA0275E829244'
+    },
+    size: 0,
+    rt: 92
+  }
+}
+```
+
+- Add an object through content buffer
+
+```js
+store.put('ossdemo/buffer', Buffer.from('foo content')).then((result) => {
+  console.log(result);
+});
+
+{
+  name: 'ossdemo/buffer',
+  url: 'http://demo.oss-cn-hangzhou.aliyuncs.com/ossdemo/buffer',
+  res: {
+    status: 200,
+    headers: {
+      date: 'Tue, 17 Feb 2015 13:28:17 GMT',
+      'content-length': '0',
+      connection: 'close',
+      etag: '"xxx"',
+      server: 'AliyunOSS',
+      'x-oss-request-id': '54E341F1707AA0275E829243'
+    },
+    size: 0,
+    rt: 92
+  }
+}
+```
+
+- Add an object through readstream
+
+```js
+const filepath = '/home/ossdemo/demo.txt';
+store.put('ossdemo/readstream.txt', fs.createReadStream(filepath)).then((result) => {
+  console.log(result);
+});
+
+{
+  name: 'ossdemo/readstream.txt',
+  url: 'http://demo.oss-cn-hangzhou.aliyuncs.com/ossdemo/readstream.txt',
+  res: {
+    status: 200,
+    headers: {
+      date: 'Tue, 17 Feb 2015 13:28:17 GMT',
+      'content-length': '0',
+      connection: 'close',
+      etag: '"BF7A03DA01440845BC5D487B369BC168"',
+      server: 'AliyunOSS',
+      'x-oss-request-id': '54E341F1707AA0275E829242'
+    },
+    size: 0,
+    rt: 92
+  }
+}
+```
+
+### .putStream(name, stream[, options])
+
+Add a stream object to the bucket.
+
+parameters:
+
+- name {String} object name store on OSS
+- stream {ReadStream} object ReadStream content instance
+- [options] {Object} optional parameters
+  - [contentLength] {Number} the stream length, `chunked encoding` will be used if absent
+  - [timeout] {Number} the operation timeout
+  - [mime] {String} custom mime, will send with `Content-Type` entity header
+  - [meta] {Object} user meta, will send with `x-oss-meta-` prefix string
+    e.g.: `{ uid: 123, pid: 110 }`
+  - [callback] {Object} The callback parameter is composed of a JSON string encoded in Base64,detail [see](https://www.alibabacloud.com/help/doc-detail/31989.htm)<br>
+    - url {String} After a file is uploaded successfully, the OSS sends a callback request to this URL.
+    - [host] {String} The host header value for initiating callback requests.
+    - body {String} The value of the request body when a callback is initiated, for example, key=$(key)&etag=$(etag)&my_var=$(x:my_var).
+    - [contentType] {String} The Content-Type of the callback requests initiatiated, It supports application/x-www-form-urlencoded and application/json, and the former is the default value.
+    - [customValue] {Object} Custom parameters are a map of key-values<br>
+         e.g.:
+        ```js
+           var customValue = {var1: 'value1', var2: 'value2'}
+        ```
+  - [headers] {Object} extra headers, detail see [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616.html)
+    - 'Cache-Control' cache control for download, e.g.: `Cache-Control: public, no-cache`
+    - 'Content-Disposition' object name for download, e.g.: `Content-Disposition: somename`
+    - 'Content-Encoding' object content encoding for download, e.g.: `Content-Encoding: gzip`
+    - 'Expires' expires time for download, an absolute date and time. e.g.: `Tue, 08 Dec 2020 13:49:43 GMT`
+
+Success will return the object information.
+
+object:
+
+- name {String} object name
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Add an object through readstream
+
+```js
+const filepath = '/home/ossdemo/demo.txt';
+store.putStream('ossdemo/readstream.txt', fs.createReadStream(filepath)).then((result) => {
+  console.log(result);
+});
+
+{
+  name: 'ossdemo/readstream.txt',
+  url: 'http://demo.oss-cn-hangzhou.aliyuncs.com/ossdemo/readstream.txt',
+  res: {
+    status: 200,
+    headers: {
+      date: 'Tue, 17 Feb 2015 13:28:17 GMT',
+      'content-length': '0',
+      connection: 'close',
+      etag: '"BF7A03DA01440845BC5D487B369BC168"',
+      server: 'AliyunOSS',
+      'x-oss-request-id': '54E341F1707AA0275E829242'
+    },
+    size: 0,
+    rt: 92
+  }
+}
+```
+
+### .append(name, file[, options])
+
+Append an object to the bucket, it's almost same as put, but it can add content to existing object rather than override it.
+
+All parameters are same as put except for options.position
+
+- name {String} object name store on OSS
+- file {String|Buffer|ReadStream} object local path, content buffer or ReadStream content instance
+- [options] {Object} optional parameters
+  - [position] {String} specify the position which is the content length of the latest object
+  - [timeout] {Number} the operation timeout
+  - [mime] {String} custom mime, will send with `Content-Type` entity header
+  - [meta] {Object} user meta, will send with `x-oss-meta-` prefix string
+    e.g.: `{ uid: 123, pid: 110 }`
+  - [headers] {Object} extra headers, detail see [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616.html)
+    - 'Cache-Control' cache control for download, e.g.: `Cache-Control: public, no-cache`
+    - 'Content-Disposition' object name for download, e.g.: `Content-Disposition: somename`
+    - 'Content-Encoding' object content encoding for download, e.g.: `Content-Encoding: gzip`
+    - 'Expires' expires time for download, an absolute date and time. e.g.: `Tue, 08 Dec 2020 13:49:43 GMT`
+
+object:
+
+- name {String} object name
+- url {String} the url of oss
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- nextAppendPosition {String} the next position
+
+example:
+
+```js
+let object = await store.append('ossdemo/buffer', Buffer.from('foo'));
+
+// append content to the existing object
+object = await store.append('ossdemo/buffer', Buffer.from('bar'), {
+  position: object.nextAppendPosition,
+});
+```
+
+### .getObjectUrl(name[, baseUrl])
+
+Get the Object url.
+If provide `baseUrl`, will use `baseUrl` instead the default `endpoint`.
+
+e.g.:
+
+```js
+const cdnUrl = client.getObjectUrl('foo/bar.jpg', 'https://mycdn.domian.com');
+// cdnUrl should be `https://mycdn.domian.com/foo/bar.jpg`
+```
+
+### .generateObjectUrl(name[, baseUrl])
+
+Get the Object url.
+If provide `baseUrl`, will use `baseUrl` instead the default `bucket and endpoint `.
+Suggest use generateObjectUrl instead of getObjectUrl.
+
+e.g.:
+
+```js
+const url = client.generateObjectUrl('foo/bar.jpg');
+// cdnUrl should be `https://${bucketname}.${endpotint}foo/bar.jpg`
+
+const cdnUrl = client.generateObjectUrl('foo/bar.jpg', 'https://mycdn.domian.com');
+// cdnUrl should be `https://mycdn.domian.com/foo/bar.jpg`
+```
+
+### .head(name[, options])
+
+Head an object and get the meta info.
+
+parameters:
+
+- name {String} object name store on OSS
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [versionId] {String} the version id of history object
+  - [headers] {Object} extra headers, detail see [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616.html)
+    - 'If-Modified-Since' object modified after this time will return 200 and object meta,
+        otherwise return 304 not modified
+    - 'If-Unmodified-Since' object modified before this time will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-Match' object etag equal this will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-None-Match' object etag not equal this will return 200 and object meta,
+        otherwise return 304 not modified
+
+Success will return the object's meta information.
+
+object:
+
+- status {Number} response status, maybe 200 or 304
+- meta {Object} object user meta, if not set on `put()`, will return null.
+    If return status 304, meta will be null too
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+    - [x-oss-version-id] return in multiversion
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Head an exists object and get user meta
+
+```js
+await this.store.put('ossdemo/head-meta', Buffer.from('foo'), {
+  meta: {
+    uid: 1,
+    path: 'foo/demo.txt'
+  }
+});
+const object = await this.store.head('ossdemo/head-meta');
+console.log(object);
+
+{
+  status: 200,
+  meta: {
+    uid: '1',
+    path: 'foo/demo.txt'
+  },
+  res: { ... }
+}
+```
+
+- Head a not exists object
+
+```js
+const object = await this.store.head('ossdemo/head-meta');
+// will throw NoSuchKeyError
+```
+
+### .getObjectMeta(name[, options])
+
+Get an  object meta info include ETag、Size、LastModified and so on, not return object content.
+
+parameters:
+
+- name {String} object name store on OSS
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [versionId] {String} the version id of history object
+
+Success will return the object's meta information.
+
+object:
+
+- status {Number} response status
+- res {Object} response info, including
+  - headers {Object} response headers
+
+example:
+
+- Head an exists object and get object meta info
+
+```js
+await this.store.put('ossdemo/object-meta', Buffer.from('foo'));
+const object = await this.store.getObjectMeta('ossdemo/object-meta');
+console.log(object);
+
+{
+  status: 200,
+  res: { ... }
+}
+```
+
+### .get(name[, file, options])
+
+Get an object from the bucket.
+
+parameters:
+
+- name {String} object name store on OSS
+- [file] {String|WriteStream} file path or WriteStream instance to store the content
+  If `file` is null or ignore this parameter, function will return info contains `content` property.
+- [options] {Object} optional parameters
+  - [versionId] {String} the version id of history object
+  - [timeout] {Number} the operation timeout
+  - [process] {String} image process params, will send with `x-oss-process`
+    e.g.: `{process: 'image/resize,w_200'}`
+  - [responseCacheControl] {String} default `no-cache`, (only support Browser). response-cache-control, will response with HTTP Header `Cache-Control`
+  - [headers] {Object} extra headers, detail see [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616.html)
+    - 'Range' get specifying range bytes content, e.g.: `Range: bytes=0-9`
+    - 'If-Modified-Since' object modified after this time will return 200 and object meta,
+        otherwise return 304 not modified
+    - 'If-Unmodified-Since' object modified before this time will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-Match' object etag equal this will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-None-Match' object etag not equal this will return 200 and object meta,
+        otherwise return 304 not modified
+
+Success will return the info contains response.
+
+object:
+
+- [content] {Buffer} file content buffer if `file` parameter is null or ignore
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+If object not exists, will throw NoSuchKeyError.
+
+example:
+
+- Get an exists object and store it to the local file
+
+```js
+const filepath = '/home/ossdemo/demo.txt';
+await store.get('ossdemo/demo.txt', filepath);
+```
+
+_ Store object to a writestream
+
+```js
+await store.get('ossdemo/demo.txt', somestream);
+```
+
+- Get an object content buffer
+
+```js
+const result = await store.get('ossdemo/demo.txt');
+console.log(Buffer.isBuffer(result.content));
+```
+
+- Get a processed image and store it to the local file
+
+```js
+const filepath = '/home/ossdemo/demo.png';
+await store.get('ossdemo/demo.png', filepath, {process: 'image/resize,w_200'});
+```
+
+- Get a not exists object
+
+```js
+const filepath = '/home/ossdemo/demo.txt';
+await store.get('ossdemo/not-exists-demo.txt', filepath);
+// will throw NoSuchKeyError
+```
+
+- Get a historic version object
+
+```js
+const filepath = '/home/ossdemo/demo.txt';
+const versionId = 'versionId string';
+await store.get('ossdemo/not-exists-demo.txt', filepath, {
+  versionId
+});
+```
+
+### .getStream(name[, options])
+
+Get an object read stream.
+
+parameters:
+
+- name {String} object name store on OSS
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [process] {String} image process params, will send with `x-oss-process`
+  - [headers] {Object} extra headers
+    - 'If-Modified-Since' object modified after this time will return 200 and object meta,
+        otherwise return 304 not modified
+    - 'If-Unmodified-Since' object modified before this time will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-Match' object etag equal this will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-None-Match' object etag not equal this will return 200 and object meta,
+        otherwise return 304 not modified
+
+Success will return the stream instance and response info.
+
+object:
+
+- stream {ReadStream} readable stream instance
+    if response status is not 200, stream will be `null`.
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+If object not exists, will throw NoSuchKeyError.
+
+example:
+
+- Get an exists object stream
+
+```js
+const result = await store.getStream('ossdemo/demo.txt');
+result.stream.pipe(fs.createWriteStream('some file.txt'));
+```
+
+### .delete(name[, options])
+
+Delete an object from the bucket.
+
+parameters:
+
+- name {String} object name store on OSS
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [versionId] {String} the version id of history object
+
+Success will return the info contains response.
+
+object:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+If delete object not exists, will also delete success.
+
+example:
+
+- Delete an exists object
+
+```js
+await store.delete('ossdemo/someobject');
+```
+
+- Delete a not exists object
+
+```js
+await store.delete('ossdemo/some-not-exists-object');
+```
+
+- Delete a history object or deleteMarker
+
+```js
+const versionId = 'versionId';
+await store.delete('ossdemo/some-not-exists-object', { versionId });
+```
+
+### .copy(name, sourceName[, sourceBucket, options])
+
+Copy an object from `sourceName` to `name`.
+
+parameters:
+
+- name {String} object name store on OSS
+- sourceName {String} source object name
+- [sourceBucket] {String} source Bucket. if doesn't exist,`sourceBucket` is same bucket.
+- [options] {Object} optional parameters
+  - [versionId] {String} the version id of history object
+  - [timeout] {Number} the operation timeout
+  - [meta] {Object} user meta, will send with `x-oss-meta-` prefix string
+    e.g.: `{ uid: 123, pid: 110 }`
+    If the `meta` set, will override the source object meta.
+  - [headers] {Object} extra headers
+    - 'If-Match' do copy if source object etag equal this,
+      otherwise throw PreconditionFailedError
+    - 'If-None-Match' do copy if source object etag not equal this,
+      otherwise throw PreconditionFailedError
+    - 'If-Modified-Since' do copy if source object modified after this time,
+        otherwise throw PreconditionFailedError
+    - 'If-Unmodified-Since' do copy if source object modified before this time,
+        otherwise throw PreconditionFailedError
+    - See more: [CopyObject](https://help.aliyun.com/document_detail/31979.html?#title-tzy-vxc-ncx)
+
+Success will return the copy result in `data` property.
+
+object:
+
+- data {Object} copy result
+  - lastModified {String} object last modified GMT string
+  - etag {String} object etag contains `"`, e.g.: `"5B3C1A2E053D763E1B002CC607C5A0FE"`
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+If source object not exists, will throw NoSuchKeyError.
+
+example:
+
+- Copy same bucket object
+
+```js
+store.copy('newName', 'oldName').then((result) => {
+  console.log(result);
+});
+```
+
+- Copy other bucket object
+
+```js
+store.copy('logo.png', 'logo.png', 'other-bucket').then((result) => {
+  console.log(result);
+});
+```
+
+- Copy historic object
+
+```js
+const versionId = 'your verisonId'
+store.copy('logo.png', 'logo.png', 'other-bucket', { versionId }).then((result) => {
+  console.log(result);
+});
+```
+
+### .putMeta(name, meta[, options])
+
+Set an exists object meta.
+
+parameters:
+
+- name {String} object name store on OSS
+- meta {Object} user meta, will send with `x-oss-meta-` prefix string
+  e.g.: `{ uid: 123, pid: 110 }`
+  If `meta: null`, will clean up the exists meta
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the putMeta result in `data` property.
+
+- data {Object} copy result
+  - lastModified {String} object last modified GMT date, e.g.: `2015-02-19T08:39:44.000Z`
+  - etag {String} object etag contains `"`, e.g.: `"5B3C1A2E053D763E1B002CC607C5A0FE"`
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+If object not exists, will throw NoSuchKeyError.
+
+example:
+
+- Update exists object meta
+
+```js
+const result = await store.putMeta('ossdemo.txt', {
+  uid: 1, pid: 'p123'
+});
+console.log(result);
+```
+
+- Clean up object meta
+
+```js
+await store.putMeta('ossdemo.txt', null);
+```
+
+### .deleteMulti(names[, options])
+
+Delete multi objects in one request.
+
+parameters:
+
+- names {Array<Object>} object names, max 1000 objects in once.
+  - key {String} object name
+  - [versionId] {String} the version id of history object or deleteMarker
+- [options] {Object} optional parameters
+  - [quiet] {Boolean} quiet mode or verbose mode, default is `false`, verbose mode
+    quiet mode: if all objects delete succes, return emtpy response.
+      otherwise return delete error object results.
+    verbose mode: return all object delete results.
+  - [timeout] {Number} the operation timeout
+
+Success will return delete success objects in `deleted` property.
+
+- [deleted] {Array<Object>} deleted object or deleteMarker info list
+  - [Key] {String} object name
+  - [VersionId] {String} object versionId
+  - [DeleteMarker] {String} generate or delete marker
+  - [DeleteMarkerVersionId] {String} marker versionId
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Delete multi objects in quiet mode
+
+```js
+const result = await store.deleteMulti(['obj1', 'obj2', 'obj3'], {
+  quiet: true
+});
+```
+
+- Delete multi objects in verbose mode
+
+```js
+const result = await store.deleteMulti(['obj1', 'obj2', 'obj3']);
+```
+
+- Delete multi objects in multiversion
+
+```js
+const obj1 = {
+  key: 'key1',
+  versionId: 'versionId1'
+}
+const obj2 = {
+  key: 'key2',
+  versionId: 'versionId2'
+}
+const result = await store.deleteMulti([obj1, obj2]);
+```
+
+### .list(query[, options])
+
+List objects in the bucket.
+
+parameters:
+
+- [query] {Object} query parameters, default is `null`
+  - [prefix] {String} search object using `prefix` key
+  - [marker] {String} search start from `marker`, including `marker` key
+  - [delimiter] {String} delimiter search scope
+    e.g. `/` only search current dir, not including subdir
+  - [max-keys] {String|Number} max objects, default is `100`, limit to `1000`
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return objects list on `objects` properties.
+
+- objects {Array<ObjectMeta>} object meta info list
+  Each `ObjectMeta` will contains blow properties:
+    - name {String} object name on oss
+    - lastModified {String} object last modified GMT date, e.g.: `2015-02-19T08:39:44.000Z`
+    - etag {String} object etag contains `"`, e.g.: `"5B3C1A2E053D763E1B002CC607C5A0FE"`
+    - type {String} object type, e.g.: `Normal`
+    - size {Number} object size, e.g.: `344606`
+    - storageClass {String} storage class type, e.g.: `Standard`
+    - owner {Object} object owner, including `id` and `displayName`
+- prefixes {Array<String>} prefix list
+- isTruncated {Boolean} truncate or not
+- nextMarker {String} next marker string
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- List top 10 objects
+
+```js
+const result = await store.list();
+console.log(result.objects);
+```
+
+- List `fun/` dir including subdirs objects
+
+```js
+const result = await store.list({
+  prefix: 'fun/'
+});
+console.log(result.objects);
+```
+
+- List `fun/` dir objects, not including subdirs
+
+```js
+const result = await store.list({
+  prefix: 'fun/',
+  delimiter: '/'
+});
+console.log(result.objects);
+```
+
+### .listV2(query[, options])
+
+List objects in the bucket.(recommended)
+
+parameters:
+
+- [query] {Object} query parameters, default is `null`
+  - [prefix] {String} search object using `prefix` key
+  - [continuation-token] (continuationToken) {String} search start from `continuationToken`, including `continuationToken` key
+  - [delimiter] {String} delimiter search scope
+    e.g. `/` only search current dir, not including subdir
+  - [max-keys] {String|Number} max objects, default is `100`, limit to `1000`
+  - [start-after] {String} specifies the Start-after value from which to start the list. The names of objects are returned in alphabetical order.
+  - [fetch-owner] {Boolean} specifies whether to include the owner information in the response.
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return objects list on `objects` properties.
+
+- objects {Array<ObjectMeta>} object meta info list
+  Each `ObjectMeta` will contains blow properties:
+  - name {String} object name on oss
+  - url {String} resource url
+  - lastModified {String} object last modified GMT date, e.g.: `2015-02-19T08:39:44.000Z`
+  - etag {String} object etag contains `"`, e.g.: `"5B3C1A2E053D763E1B002CC607C5A0FE"`
+  - type {String} object type, e.g.: `Normal`
+  - size {Number} object size, e.g.: `344606`
+  - storageClass {String} storage class type, e.g.: `Standard`
+  - owner {Object|null} object owner, including `id` and `displayName`
+- prefixes {Array<String>} prefix list
+- isTruncated {Boolean} truncate or not
+- nextContinuationToken {String} next continuation-token string
+- keyCount {Number} The number of keys returned for this request. If Delimiter is specified, KeyCount is the sum of the elements in Key and CommonPrefixes.
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+- List top 10 objects
+
+```js
+const result = await store.listV2({
+  'max-keys': 10
+});
+console.log(result.objects);
+```
+
+- List `fun/` dir including subdirs objects
+
+```js
+const result = await store.listV2({
+  prefix: 'fun/'
+});
+console.log(result.objects);
+```
+
+- List `fun/` dir objects, not including subdirs
+
+```js
+const result = await store.listV2({
+  prefix: 'fun/',
+  delimiter: '/'
+});
+console.log(result.objects);
+```
+
+- List `a/` dir objects, after `a/b` and not include `a/b`
+
+```js
+const result = await store.listV2({
+  delimiter: '/',
+  prefix: 'a/',
+  'start-after': 'a/b'
+});
+console.log(result.objects);
+```
+
+### .getBucketVersions(query[, options])
+
+List the version information of all objects in the bucket, including the delete marker (Delete Marker).
+
+parameters:
+
+- [query] {Object} query parameters, default is `null`
+  - [prefix] {String} search object using `prefix` key
+  - [versionIdMarker] {String} set the result to return from the version ID marker of the key marker object and sort by the versions
+  - [keyMarker] {String} search start from `keyMarker`, including `keyMarker` key
+  - [encodingType] {String} specifies that the returned content is encoded, and specifies the type of encoding
+  - [delimiter] {String} delimiter search scope
+    e.g. `/` only search current dir, not including subdir
+  - [maxKeys] {String|Number} max objects, default is `100`, limit to `1000`
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return objects list on `objects` properties.
+
+- objects {Array<ObjectMeta>} object meta info list
+  Each `ObjectMeta` will contains blow properties:
+    - name {String} object name on oss
+    - lastModified {String} object last modified GMT date, e.g.: `2015-02-19T08:39:44.000Z`
+    - etag {String} object etag contains `"`, e.g.: `"5B3C1A2E053D763E1B002CC607C5A0FE"`
+    - type {String} object type, e.g.: `Normal`
+    - size {Number} object size, e.g.: `344606`
+    - isLatest {Boolean}
+    - versionId {String} object versionId
+    - storageClass {String} storage class type, e.g.: `Standard`
+    - owner {Object} object owner, including `id` and `displayName`
+- deleteMarker {Array<ObjectDeleteMarker>} object delete marker info list
+  Each `ObjectDeleteMarker`
+    - name {String} object name on oss
+    - lastModified {String} object last modified GMT date, e.g.: `2015-02-19T08:39:44.000Z`
+    - versionId {String} object versionId
+- isTruncated {Boolean} truncate or not
+- nextKeyMarker (nextMarker) {String} next marker string
+- nextVersionIdMarker (NextVersionIdMarker) {String} next version ID marker string
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- View all versions of objects and deleteMarker of bucket
+
+```js
+const result = await store.getBucketVersions();
+console.log(result.objects);
+console.log(result.deleteMarker);
+```
+
+- List from key-marker
+
+```js
+const result = await store.getBucketVersions({
+  'keyMarker': 'keyMarker'
+});
+console.log(result.objects);
+```
+
+- List from the version-id-marker of key-marker
+
+```js
+const result = await store.getBucketVersions({
+  'versionIdMarker': 'versionIdMarker',
+  'keyMarker': 'keyMarker'
+});
+console.log(result.objects);
+console.log(result.deleteMarker);
+```
+
+### .signatureUrl(name[, options])
+
+Create a signature url for download or upload object. When you put object with signatureUrl ,you need to pass `Content-Type`.Please look at the example.
+
+parameters:
+
+- name {String} object name store on OSS
+- [options] {Object} optional parameters
+  - [expires] {Number} after expires seconds, the url will become invalid, default is `1800`
+  - [method] {String} the HTTP method, default is 'GET'
+  - [Content-Type] {String} set the request content type
+  - [process] {String} image process params, will send with `x-oss-process`
+    e.g.: `{process: 'image/resize,w_200'}`
+  - [trafficLimit] {Number} traffic limit, range: `819200`~`838860800`.
+  - [subResource] {Object} additional signature parameters in url.
+  - [response] {Object} set the response headers for download
+    - [content-type] {String} set the response content type
+    - [content-disposition] {String} set the response content disposition
+    - [cache-control] {String} set the response cache control
+    - See more: <https://help.aliyun.com/document_detail/31980.html>
+  - [callback] {Object} set the callback for the operation
+    - url {String} set the url for callback
+    - [host] {String} set the host for callback
+    - body {String} set the body for callback
+    - [contentType] {String} set the type for body
+    - [customValue] {Object} set the custom value for callback,eg. {var1: value1,var2:value2}
+
+Success will return signature url.
+
+example:
+
+- Get signature url for object
+
+```js
+const url = store.signatureUrl('ossdemo.txt');
+console.log(url);
+// --------------------------------------------------
+const url = store.signatureUrl('ossdemo.txt', {
+  expires: 3600,
+  method: 'PUT'
+});
+console.log(url);
+
+//  put object with signatureUrl
+// -------------------------------------------------
+
+const url = store.signatureUrl('ossdemo.txt', {
+  expires: 3600,
+  method: 'PUT',
+  'Content-Type': 'text/plain; charset=UTF-8',
+});
+console.log(url);
+
+// --------------------------------------------------
+const url = store.signatureUrl('ossdemo.txt', {
+  expires: 3600,
+  response: {
+    'content-type': 'text/custom',
+    'content-disposition': 'attachment'
+  }
+});
+console.log(url);
+
+// put operation
+```
+
+- Get a signature url for a processed image
+
+```js
+const url = store.signatureUrl('ossdemo.png', {
+  process: 'image/resize,w_200'
+});
+console.log(url);
+// --------------------------------------------------
+const url = store.signatureUrl('ossdemo.png', {
+  expires: 3600,
+  process: 'image/resize,w_200'
+});
+console.log(url);
+```
+
+### .putACL(name, acl[, options])
+
+Set object's ACL.
+
+parameters:
+
+- name {String} object name
+- acl {String} acl (private/public-read/public-read-write)
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [versionId] {String} the version id of history object
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Set an object's ACL
+
+```js
+await store.putACL('ossdemo.txt', 'public-read');
+```
+
+- Set an history object's ACL
+
+```js
+const versionId = 'object versionId'
+await store.putACL('ossdemo.txt', 'public-read', {
+  versionId
+});
+```
+
+### .getACL(name[, options])
+
+Get object's ACL.
+
+parameters:
+
+- name {String} object name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [versionId] {String} the version id of history object
+
+Success will return:
+
+- acl {String} acl settiongs string
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Get an object's ACL
+
+```js
+const result = await store.getACL('ossdemo.txt');
+console.log(result.acl);
+```
+
+- Get an history object's ACL
+
+```js
+const versionId = 'object versionId'
+const result = await store.getACL('ossdemo.txt', { versionId });
+console.log(result.acl);
+```
+
+### .restore(name[, options])
+
+Restore Object.
+
+parameters:
+
+- name {String} object name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [versionId] {String} the version id of history object 
+  - [type] {String} the default type is Archive 
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+- Restore an object with Archive type
+
+```js
+const result = await store.restore('ossdemo.txt');
+console.log(result.status);
+```
+
+- Restore an object with ColdArchive type
+
+```js
+const result = await store.restore('ossdemo.txt',{type:'ColdArchive'});
+console.log(result.status);
+```
+
+
+- Days for unfreezing Specifies the days for unfreezing
+
+```js
+const result = await store.restore('ossdemo.txt',{type:'ColdArchive',Days:2});
+console.log(result.status);
+```
+
+- Restore an history object
+
+```js
+const versionId = 'object versionId';
+const result = await store.restore('ossdemo.txt', { versionId });
+console.log(result.status);
+```
+
+### .putSymlink(name, targetName[, options])
+
+PutSymlink
+
+parameters:
+
+- name {String} object name
+- targetName {String} target object name
+- [options] {Object} optional parameters
+  - [storageClass] {String} the storage type include (Standard,IA,Archive)
+  - [meta] {Object} user meta, will send with `x-oss-meta-` prefix string
+  - [headers] {Object} extra headers, detail see [PutSymlink](https://help.aliyun.com/document_detail/45126.html#title-x71-l2b-7i8)
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+```js
+const options = {
+  storageClass: 'IA',
+  meta: {
+    uid: '1',
+    slus: 'test.html'
+  }
+}
+const result = await store.putSymlink('ossdemo.txt', 'targetName', options)
+console.log(result.res)
+```
+
+putSymlink multiversion
+```js
+const options = {
+  storageClass: 'IA',
+  meta: {
+    uid: '1',
+    slus: 'test.html'
+  },
+}
+const result = await store.putSymlink('ossdemo.txt', 'targetName', options)
+console.log(result.res.headers['x-oss-version-id'])
+```
+
+### .getSymlink(name[, options])
+
+GetSymlink
+
+parameters:
+
+- name {String} object name
+- [options] {Object} optional parameters
+- [versionId] {String} the version id of history object
+
+Success will return
+
+- targetName {String} target object name
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+example:
+
+```js
+const result = await store.getSymlink('ossdemo.txt')
+console.log(result.targetName)
+```
+
+for history object
+```js
+const versionId = 'object versionId';
+const result = await store.getSymlink('ossdemo.txt', { versionId })
+console.log(result.targetName)
+```
+
+### .initMultipartUpload(name[, options])
+Before transmitting data in the Multipart Upload mode,
+you must call the Initiate Multipart Upload interface to notify the OSS to initiate a Multipart Upload event.
+The Initiate Multipart Upload interface returns a globally unique Upload ID created by the OSS server to identify this Multipart Upload event.
+
+parameters:
+
+- name {String} object name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [mime] Mime file type e.g.: application/octet-stream
+  - [meta] {Object} user meta, will send with `x-oss-meta-` prefix string
+  - [headers] {Object} extra headers
+    - 'Cache-Control' cache control for download, e.g.: `Cache-Control: public, no-cache`
+    - 'Content-Disposition' object name for download, e.g.: `Content-Disposition: somename`
+    - 'Content-Encoding' object content encoding for download, e.g.: `Content-Encoding: gzip`
+    - 'Expires' expires time for download, an absolute date and time. e.g.: `Tue, 08 Dec 2020 13:49:43 GMT`
+    - [x-oss-server-side-encryption]
+    Specify the server-side encryption algorithm used to upload each part of this object,Type: string, Valid value: AES256 `x-oss-server-side-encryption: AES256`<br>
+    if use in browser you should be set cors expose header x-oss-server-side-encryption
+    - See more: [InitiateMultipartUpload](https://help.aliyun.com/document_detail/31992.html?#title-wh0-a2h-rur)
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+    - [x-oss-server-side-encryption] if set request header x-oss-server-side-encryption, will return
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- bucket {String} bucket name
+- name {String} object name store on OSS
+- uploadId {String} upload id, use for uploadPart, completeMultipart
+
+example:
+
+```js
+  const result = await store.initMultipartUpload('object');
+  console.log(result);
+```
+
+### .uploadPart(name, uploadId, partNo, file, start, end[, options])
+After initiating a Multipart Upload event, you can upload data in parts based on the specified object name and Upload ID.
+
+parameters:
+
+- name {String} object name
+- uploadId {String} get by initMultipartUpload api
+- partNo {Number} range is 1-10000, If this range is exceeded, OSS returns the InvalidArgument's error code.
+- file {File|String}  is File or FileName, the whole file<br>
+ Multipart Upload requires that the size of any Part other than the last Part is greater than 100KB. <br>
+ In Node you can use File or FileName, but in browser you only can use File.
+- start {Number} part start bytes  e.g: 102400
+- end {Number} part end bytes  e.g: 204800
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- name {String} object name store on OSS
+- etag {String} object etag contains ", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"
+
+example:
+
+```js
+  const name = 'object';
+  const result = await store.initMultipartUpload(name);
+  const uploadId = result.uploadId;
+  const file; //the data you want to upload, is a File or FileName(only in node)
+  //if file part is 10
+  const partSize = 100 * 1024;
+  const fileSize = 10 * partSize;//you need to calculate
+  const dones = [];
+  for (let i = 1; i <= 10; i++) {
+    const start = partSize * (i -1);
+    const end = Math.min(start + partSize, fileSize);
+    const part = await store.uploadPart(name, uploadId, i, file, start, end);
+    dones.push({
+      number: i,
+      etag: part.etag
+    });
+    console.log(part);
+  }
+
+  //end need to call completeMultipartUpload api
+```
+
+### .uploadPartCopy(name, uploadId, partNo, range, sourceData[, options])
+Using Upload Part Copy, you can copy data from an existing object and upload a part of the data.
+When copying a file larger than 1 GB, you must use the Upload Part Copy method. If you want to copy a file smaller than 1 GB, see Copy Object.
+
+parameters:
+
+- name {String} object name
+- uploadId {String} get by initMultipartUpload api
+- partNo {Number} range is 1-10000, If this range is exceeded, OSS returns the InvalidArgument's error code.
+- range {String} Multipart Upload requires that the size of any Part other than the last Part is greater than 100KB, range value like `0-102400`
+- sourceData {Object}
+  - sourceKey {String} the source object name
+  - sourceBucketName {String} the source bucket name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [versionId] {String} the version id of history object
+  - [headers] {Object} The following request header is used for the source objects specified by x-oss-copy-source.
+    - [x-oss-copy-source-if-match]  default none<br>
+    If the ETAG value of the source object is equal to the ETAG value provided by the user, the system performs the Copy Object operation; otherwise, the system returns the 412 Precondition Failed message.
+    - [x-oss-copy-source-if-none-match]   default none<br>
+    If the source object has not been modified since the time specified by the user, the system performs the Copy Object operation; otherwise, the system returns the 412 Precondition Failed message.
+    - [x-oss-copy-source-if-unmodified-since]   default none<br>
+    If the time specified by the received parameter is the same as or later than the modification time of the file, the system transfers the file normally, and returns 200 OK; otherwise, the system returns 412 Precondition Failed.
+    - [x-oss-copy-source-if-modified-since]   default none<br>
+    If the source object has been modified since the time specified by the user, the system performs the Copy Object operation; otherwise, the system returns the 412 Precondition Failed message.
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- name {String} object name store on OSS
+- etag {String} object etag contains ", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"
+
+example:
+
+```js
+  const name = 'object';
+  const result = await store.initMultipartUpload(name);
+
+  const partSize = 100 * 1024;//100kb
+  //if file part is 10
+  for (let i = 1; i <= 10; i++) {
+    const start = partSize * (i -1);
+    const end = Math.min(start + partSize, fileSize);
+    const range = start + '-' + (end - 1);
+    const part = await store.uploadPartCopy(name, result.uploadId, i, range, {
+      sourceKey: 'sourceKey',
+      sourceBucketName: 'sourceBucketName'
+    });
+    console.log(part);
+  }
+
+  //end need complete api
+```
+
+- use history object to uploadPartCopy
+
+```js
+  const versionId = 'object versionId';
+  const name = 'object';
+  const result = await store.initMultipartUpload(name);
+  const partSize = 100 * 1024;//100kb
+  //if file part is 10
+  for (let i = 1; i <= 10; i++) {
+    const start = partSize * (i -1);
+    const end = Math.min(start + partSize, fileSize);
+    const range = start + '-' + (end - 1);
+    const part = await store.uploadPartCopy(name, result.uploadId, i, range, {
+      sourceKey: 'sourceKey',
+      sourceBucketName: 'sourceBucketName'
+    }, {
+      versionId
+    });
+    console.log(part);
+  }
+
+  //end need complete api
+```
+
+### .completeMultipartUpload(name, uploadId, parts[, options])
+After uploading all data parts, you must call the Complete Multipart Upload API to complete Multipart Upload for the entire file.
+
+parameters:
+
+- name {String} object name
+- uploadId {String} get by initMultipartUpload api
+- parts {Array} more part {Object} from uploadPartCopy, , each in the structure:
+  - number {Number} partNo
+  - etag {String} object etag contains ", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [callback] {Object} The callback parameter is composed of a JSON string encoded in Base64,detail [see](https://www.alibabacloud.com/help/doc-detail/31989.htm)<br>
+    - url {String} After a file is uploaded successfully, the OSS sends a callback request to this URL.
+    - [host] {String} The host header value for initiating callback requests.
+    - body {String} The value of the request body when a callback is initiated, for example, key=$(key)&etag=$(etag)&my_var=$(x:my_var).
+    - [contentType] {String} The Content-Type of the callback requests initiatiated, It supports application/x-www-form-urlencoded and application/json, and the former is the default value.
+    - [customValue] {Object} Custom parameters are a map of key-values<br>
+         e.g.:
+        ```js
+           var customValue = {var1: 'value1', var2: 'value2'}
+        ```
+  - [headers] {Object} extra headers, detail see [CompleteMultipartUpload](https://help.aliyun.com/document_detail/31995.html?#title-nan-5y3-rjd)
+
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- bucket {String} bucket name
+- name {String} object name store on OSS
+- etag {String} object etag contains ", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"
+- data {Object} callback server response data , sdk use JSON.parse() return
+
+example:
+
+```js
+
+  //init multipart
+  const name = 'object';
+  const result = await store.initMultipartUpload(name);
+
+  //upload part
+  const file; //the data you want to upload, this example size is 10 * 100 * 1024
+  const fileSize;//you need to calculate
+  const partSize = 100 * 1024;//100kb
+  const done = [];
+  //if file part is 10
+  for (let i = 1; i <= 10; i++) {
+    const start = partSize * (i -1);
+    const end = Math.min(start + partSize, fileSize);
+    const data = file.slice(start, end);
+    const part = yield store.uploadPart(name, result.uploadId, i, data);
+    console.log(part);
+    done.push({
+          number: i,
+          etag: part.res.headers.etag
+        });
+  }
+
+  //complete
+  const completeData = await store.completeMultipartUpload(name, result.uploadId, done);
+  console.log(completeData);
+```
+
+
+### .multipartUpload(name, file[, options])
+
+Upload file with [OSS multipart][oss-multipart].<br>
+this function contains initMultipartUpload, uploadPart, completeMultipartUpload.
+When you use multipartUpload api,if you encounter problems with ConnectionTimeoutError, you should handle ConnectionTimeoutError in your business code. How to resolve ConnectionTimeoutError, you can decrease `partSize` size 、 Increase `timeout` 、Retry request ,
+or give tips in your business code;
+
+parameters:
+
+- name {String} object name
+- file {String|File(only support Browser)|Blob(only support Browser)|Buffer} file path or HTML5 Web File or web Blob or content buffer
+- [options] {Object} optional args
+  - [parallel] {Number} the number of parts to be uploaded in parallel
+  - [partSize] {Number} the suggested size for each part, defalut `1024 * 1024`(1MB), minimum `100 * 1024`(100KB)
+  - [progress] {Function} function | async | Promise, the progress callback called after each
+    successful upload of one part, it will be given three parameters:
+    (percentage {Number}, checkpoint {Object}, res {Object})
+  - [checkpoint] {Object} the checkpoint to resume upload, if this is
+    provided, it will continue the upload from where interrupted,
+    otherwise a new multipart upload will be created.
+    - file {File} The file object selected by the user, if the browser is restarted, it needs the user to manually trigger the settings
+    - name {String} object key
+    - fileSize {Number} file size
+    - partSize {Number} part size
+    - uploadId {String} upload id
+    - doneParts {Array} An array of pieces that have been completed, including the object structure as follows
+       - number {Number} part number
+       - etag {String} part etag
+  - [meta] {Object} user meta, will send with `x-oss-meta-` prefix string
+  - [mime] {String} custom mime , will send with `Content-Type` entity header
+  - [callback] {Object} The callback parameter is composed of a JSON string encoded in Base64,detail [see](https://www.alibabacloud.com/help/doc-detail/31989.htm)<br>
+    - url {String} After a file is uploaded successfully, the OSS sends a callback request to this URL.
+    - [host] {String} The host header value for initiating callback requests.
+    - body {String} The value of the request body when a callback is initiated, for example, key=$(key)&etag=$(etag)&my_var=$(x:my_var).
+    - [contentType] {String} The Content-Type of the callback requests initiatiated, It supports application/x-www-form-urlencoded and application/json, and the former is the default value.
+    - [customValue] {Object} Custom parameters are a map of key-values<br>
+          e.g.:
+         ```js
+           var customValue = {var1: 'value1', var2: 'value2'}
+         ```
+  - [headers] {Object} extra headers, detail see [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616.html)
+    - 'Cache-Control' cache control for download, e.g.: `Cache-Control: public, no-cache`
+    - 'Content-Disposition' object name for download, e.g.: `Content-Disposition: somename`
+    - 'Content-Encoding' object content encoding for download, e.g.: `Content-Encoding: gzip`
+    - 'Expires' expires time for download, an absolute date and time. e.g.: `Tue, 08 Dec 2020 13:49:43 GMT`
+    - **NOTE**: Some headers are [disabled in browser][disabled-browser-headers]
+  - [timeout] {Number} Milliseconds before a request is considered to be timed out
+  - [disabledMD5] {Boolean} default true, it just work in Browser. if false,it means that MD5 is automatically calculated for uploaded files. **_NOTE:_** Synchronous computing tasks will block the main process
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- bucket {String} bucket name
+- name name {String} object name store on OSS
+- etag {String} object etag contains ", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"
+- data {Object} callback server response data, sdk use JSON.parse() return
+
+example:
+
+- Upload using multipart
+
+```js
+const result = await store.multipartUpload('object', '/tmp/file');
+let savedCpt;
+console.log(result);
+
+const result = await store.multipartUpload('object', '/tmp/file', {
+  parallel: 4,
+  partSize: 1024 * 1024,
+  progress: function (p, cpt, res) {
+    console.log(p);
+    savedCpt = cpt;
+    console.log(cpt);
+    console.log(res.headers['x-oss-request-id']);
+  }
+});
+
+const result = await store.multipartUpload('object', '/tmp/file', {
+  checkpoint: savedCpt,
+  progress: function (p, cpt, res) { //progress is generator
+    console.log(p);
+    console.log(cpt);
+    console.log(res.headers['x-oss-request-id']);
+  }
+});
+
+```
+
+- multipartUpload progress example
+
+```js
+
+//async function
+async function asyncProgress(p, cpt, res) {
+    console.log(p);
+    console.log(cpt);
+    console.log(res.headers['x-oss-request-id']);
+}
+
+const result1 = await store.multipartUpload('object', '/tmp/file', {
+  progress: asyncProgress
+});
+
+//function
+function progress(p, cpt, res) {
+    console.log(p);
+    console.log(cpt);
+    console.log(res.headers['x-oss-request-id']);
+}
+
+const result2 = await store.multipartUpload('object', '/tmp/file', {
+  progress: progress
+});
+
+```
+
+- multipartUpload with abort
+
+>tips: abort multipartUpload support on node and browser
+
+```js
+
+//start upload
+let abortCheckpoint;
+store.multipartUpload('object', '/tmp/file', {
+  progress: function (p, cpt, res) {
+    abortCheckpoint = cpt;
+  }
+}).then(res => {
+  // do something
+}.catch(err => {
+   //if abort will catch abort event
+  if (err.name === 'abort') {
+    // handle abort
+    console.log('error: ', err.message)
+  }
+}))
+
+// abort
+store.abortMultipartUpload(abortCheckpoint.name, abortCheckpoint.uploadId)
+
+```
+
+- multipartUpload with cancel
+
+>tips: cancel multipartUpload support on node and browser
+
+```js
+
+//start upload
+try {
+  const result = await store.multipartUpload('object', '/tmp/file', {
+    checkpoint: savedCpt,
+    progress: function (p, cpt, res) {
+      console.log(p);
+      console.log(cpt);
+      console.log(res.headers['x-oss-request-id']);
+    }
+  });
+} catch (err) {
+  //if cancel will catch cancel event
+  if (store.isCancel()) {
+    //do something
+  }
+}
+
+//the other event to cancel, for example: click event
+//to cancel upload must use the same client instance
+store.cancel();
+
+```
+
+- multipartUpload with capture `ConnectionTimeoutError`  error
+
+```js
+
+//start upload
+try {
+  const result = await store.multipartUpload('object', '/tmp/file', {
+    checkpoint: savedCpt,
+    progress: function (p, cpt, res) {
+      console.log(p);
+      console.log(cpt);
+      console.log(res.headers['x-oss-request-id']);
+    }
+  });
+} catch (err) {
+  if (err.code === 'ConnectionTimeoutError') {
+    console.log("Woops,Woops ,timeout error!!!");
+    // do ConnectionTimeoutError operation
+  }
+}
+
+```
+
+### .multipartUploadCopy(name, sourceData[, options])
+
+Copy file with [OSS multipart][oss-multipart]. <br>
+this function contains head, initMultipartUpload, uploadPartCopy, completeMultipartUpload.<br>
+When copying a file larger than 1 GB, you should use the Upload Part Copy method. If you want to copy a file smaller than 1 GB, see Copy Object.
+
+parameters:
+
+- name {String} object name
+- file {String|File} file path or HTML5 Web File
+- [options] {Object} optional args
+  - [timeout] {Number} Milliseconds before a request is considered to be timed out
+  - [parallel] {Number} the number of parts to be uploaded in parallel
+  - [partSize] {Number} the suggested size for each part, defalut `1024 * 1024`(1MB), minimum `100 * 1024`(100KB)
+  - [versionId] {String} the version id of history object
+  - [progress] {Function} function | async | Promise, the progress callback called after each
+    successful upload of one part, it will be given three parameters:
+    (percentage {Number}, checkpoint {Object}, res {Object})
+  - [checkpoint] {Object} the checkpoint to resume upload, if this is
+    provided, it will continue the upload from where interrupted,
+    otherwise a new multipart upload will be created.
+  - [headers] {Object} extra headers, detail see [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616.html)
+    - 'Cache-Control' cache control for download, e.g.: `Cache-Control: public, no-cache`
+    - 'Content-Disposition' object name for download, e.g.: `Content-Disposition: somename`
+    - 'Content-Encoding' object content encoding for download, e.g.: `Content-Encoding: gzip`
+    - 'Expires' expires time for download, an absolute date and time. e.g.: `Tue, 08 Dec 2020 13:49:43 GMT`
+    - **NOTE**: Some headers are [disabled in browser][disabled-browser-headers]
+  - [copyheaders] {Object} only uploadPartCopy api used, detail [see](https://www.alibabacloud.com/help/doc-detail/31994.htm)
+    - [x-oss-copy-source-if-match]  only uploadPartCopy api used, default none<br>
+    If the ETAG value of the source object is equal to the ETAG value provided by the user, the system performs the Copy Object operation; otherwise, the system returns the 412 Precondition Failed message.
+    - [x-oss-copy-source-if-none-match]  only uploadPartCopy api used, default none<br>
+    If the source object has not been modified since the time specified by the user, the system performs the Copy Object operation; otherwise, the system returns the 412 Precondition Failed message.
+    - [x-oss-copy-source-if-unmodified-since]  only uploadPartCopy api used, default none<br>
+    If the time specified by the received parameter is the same as or later than the modification time of the file, the system transfers the file normally, and returns 200 OK; otherwise, the system returns 412 Precondition Failed.
+    - [x-oss-copy-source-if-modified-since] only uploadPartCopy api used, default none<br>
+    If the source object has been modified since the time specified by the user, the system performs the Copy Object operation; otherwise, the system returns the 412 Precondition Failed message.
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- bucket {String} bucket name
+- name name {String} object name store on OSS
+- etag {String} object etag contains ", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"
+
+example:
+
+- Copy using multipart
+
+```js
+const result = await store.multipartUploadCopy('object', {
+  sourceKey: 'sourceKey',
+  sourceBucketName: 'sourceBucketName'
+});
+let savedCpt;
+console.log(result);
+
+const result = await store.multipartUploadCopy('object', {
+  sourceKey: 'sourceKey',
+  sourceBucketName: 'sourceBucketName'
+}, {
+  parallel: 4,
+  partSize: 1024 * 1024,
+  progress: function (p, cpt, res) {
+    console.log(p);
+    savedCpt = cpt;
+    console.log(cpt);
+    console.log(res.headers['x-oss-request-id']);
+  }
+});
+
+console.log(result);
+
+const result = await store.multipartUploadCopy('object', {
+  sourceKey: 'sourceKey',
+  sourceBucketName: 'sourceBucketName'
+}, {
+  checkpoint: savedCpt,
+  progress: function (p, cpt, res) {
+    console.log(p);
+    console.log(cpt);
+    console.log(res.headers['x-oss-request-id']);
+  }
+});
+
+console.log(result);
+
+```
+
+- multipartUploadCopy with abort
+
+```js
+
+//start upload
+let abortCheckpoint;
+store.multipartUploadCopy('object', {
+    sourceKey: 'sourceKey',
+    sourceBucketName: 'sourceBucketName'
+  }, {
+  progress: function (p, cpt, res) {
+    abortCheckpoint = cpt;
+  }
+}).then(res => {
+  // do something
+}.catch(err => {
+   //if abort will catch abort event
+  if (err.name === 'abort') {
+    // handle abort
+    console.log('error: ', err.message)
+  }
+}))
+
+//the other event to abort, for example: click event
+//to abort upload must use the same client instance
+store.abortMultipartUpload(abortCheckpoint.name, abortCheckpoint.uploadId)
+
+```
+
+- multipartUploadCopy with cancel
+
+```js
+
+//start upload
+try {
+  const result = await store.multipartUploadCopy('object', {
+    sourceKey: 'sourceKey',
+    sourceBucketName: 'sourceBucketName'
+  }, {
+    checkpoint: savedCpt,
+    progress: function (p, cpt, res) {
+      console.log(p);
+      console.log(cpt);
+      console.log(res.headers['x-oss-request-id']);
+    }
+  });
+} catch (err) {
+  //if cancel will catch cancel event
+  if (store.isCancel()) {
+    //do something
+  }
+}
+
+//the other event to cancel, for example: click event
+//to cancel upload must use the same client instance
+store.cancel();
+
+```
+- multipartUploadCopy with versionId
+
+```js
+
+const versionId = 'object versionId'
+//start upload
+const result = await store.multipartUploadCopy('object', {
+  sourceKey: 'sourceKey',
+  sourceBucketName: 'sourceBucketName'
+}, {
+  checkpoint: savedCpt,
+  progress: function (p, cpt, res) {
+    console.log(p);
+    console.log(cpt);
+    console.log(res.headers['x-oss-request-id']);
+  },
+  versionId
+});
+
+```
+
+### .listParts(name, uploadId[, query, options])
+
+The ListParts command can be used to list all successfully uploaded parts mapped to a specific upload ID, i.e.: those not completed and not
+aborted.
+
+parameters:
+
+- name {String} object key
+- uploadId {String} upload ID from initMultipartUpload api
+- [query] {Object} query parameters
+  - [max-parts] {Number} The maximum part number in the response of the OSS. default value: 1000.
+  - [part-number-marker] {Number} Starting position of a specific list. A part is listed only when the part number is greater than the value of this parameter.
+  - [encoding-type] {String} Specify the encoding of the returned content and the encoding type. Optional value: url
+- [options] {Object} optional args
+  - [timeout] {Number} the operation timeout
+
+Success will return:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- uploadId {String} upload ID
+- bucket {String} Specify the bucket name.
+- name {String} object name
+- PartNumberMarker {Number} Starting position of the part numbers in the listing result.
+- nextPartNumberMarker {Number} If not all results are returned this time, the response request includes the NextPartNumberMarker element to indicate the value of PartNumberMarker in the next request.
+- maxParts {Number} upload ID
+- isTruncated {Boolean} Whether the returned result list for List Parts is truncated. The “true” indicates that not all results are returned; “false” indicates that all results are returned.
+- parts {Array} The container that saves part information, each in the structure:
+  - PartNumber {Number} Part number.
+  - LastModified {Date} Time when a part is uploaded.
+  - ETag {String} ETag value in the content of the uploaded part.
+  - Size {Number} Size of the uploaded part.
+
+example:
+
+- List uploaded part
+
+```js
+
+const result = await store.listParts('objcet', 'uploadId', {
+  'max-parts': 1000
+});
+console.log(result);
+```
+
+### .listUploads(query[, options])
+
+List on-going multipart uploads, i.e.: those not completed and not
+aborted.
+
+parameters:
+
+- query {Object} query parameters
+  - [prefix] {String} the object key prefix
+  - [max-uploads] {Number} the max uploads to return
+  - [key-marker] {String} the object key marker, if `upload-id-marker`
+    is not provided, return uploads with `key > marker`, otherwise
+    return uploads with `key >= marker && uploadId > id-marker`
+  - [upload-id-marker] {String} the upload id marker, must be used
+    **WITH** `key-marker`
+- [options] {Object} optional args
+  - [timeout] {Number} the operation timeout
+
+example:
+
+- List on-going multipart uploads
+
+```js
+
+const result = await store.listUploads({
+  'max-uploads': 100,
+  'key-marker': 'my-object',
+  'upload-id-marker': 'upload-id'
+});
+console.log(result);
+```
+
+### .abortMultipartUpload(name, uploadId[, options])
+
+Abort a multipart upload for object.
+
+parameters:
+
+- name {String} the object name
+- uploadId {String} the upload id
+- [options] {Object} optional args
+  - [timeout] {Number} the operation timeout
+
+example:
+
+- Abort a multipart upload
+
+```js
+const result = await store.abortMultipartUpload('object', 'upload-id');
+console.log(result);
+```
+
+### .calculatePostSignature(policy)
+
+get postObject params
+
+parameters:
+
+- policy {JSON or Object} policy must contain expiration and conditions.
+
+Success will return postObject Api params.
+
+Object:
+
+- OSSAccessKeyId {String}
+- Signature {String}
+- policy {Object} response info
+
+### .getObjectTagging(name[, options])
+
+Obtains the tags of an object.
+
+parameters:
+
+- name {String} the object name
+- [options] {Object} optional args
+  - [versionId] {String} the version id of history object
+
+Success will return the channel information.
+
+object:
+
+- tag {Object} the tag of object
+- res {Object} response info
+
+### .putObjectTagging(name, tag[, options])
+
+Configures or updates the tags of an object.
+
+parameters:
+
+- name {String} the object name
+- tag {Object} tag, eg. `{var1: value1,var2:value2}`
+- [options] {Object} optional args
+  - [versionId] {String} the version id of history object
+
+Success will return the channel information.
+
+object:
+
+- status {Number} response status
+- res {Object} response info
+
+### .deleteObjectTagging(name[, options])
+
+Deletes the tag of a specified object.
+
+parameters:
+
+- name {String} the object name
+- tag {Object} tag, eg. `{var1: value1,var2:value2}`
+- [options] {Object} optional args
+  - [versionId] {String} the version id of history object
+
+Success will return the channel information.
+
+object:
+
+- status {Number} response status
+- res {Object} response info
+
+### .processObjectSave(sourceObject, targetObject, process[, targetBucket])
+
+Persistency indicates that images are asynchronously stored in the specified Bucket
+
+parameters:
+
+- sourceObject {String} source object name
+- targetObject {String} target object name
+- process {String} process string
+- [targetBucket] {String} target bucket
+
+Success will return the channel information.
+
+object:
+
+- status {Number} response status
+- res {Object} response info
+
+
+```js
+const sourceObject = 'a.png'
+const targetObject = 'b.png'
+const process = 'image/watermark,text_aGVsbG8g5Zu+54mH5pyN5Yqh77yB,color_ff6a00'
+
+await this.store.processObjectSave(sourceObject, targetObject, process);
+```
+
+## RTMP Operations
+
+All operations function is [async], except `getRtmpUrl`.
+
+async function format: `async functionName(...)`.
+
+### .putChannel(id, conf[, options])
+
+Create a live channel.
+
+parameters:
+
+- id {String} the channel id
+- conf {Object} the channel config
+  - [Description] {String} the channel description
+  - [Status] {String} the channel status: 'enabled' or 'disabled'
+  - [Target] {Object}
+    - [Type] {String} the data type for the channel, only 'HLS' is supported now
+    - [FragDuration] {Number} duration of a 'ts' segment
+    - [FragCount] {Number} the number of 'ts' segments in a 'm3u8'
+    - [PlaylistName] {String} the 'm3u8' name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the channel information.
+
+object:
+
+- publishUrls {Array} the publish urls
+- playUrls {Array} the play urls
+- res {Object} response info
+
+example:
+
+- Create a live channel
+
+```js
+const cid = 'my-channel';
+const conf = {
+  Description: 'this is channel 1',
+  Status: 'enabled',
+  Target: {
+    Type: 'HLS',
+    FragDuration: '10',
+    FragCount: '5',
+    PlaylistName: 'playlist.m3u8'
+  }
+};
+
+const r = await this.store.putChannel(cid, conf);
+console.log(r);
+```
+
+### .getChannel(id[, options])
+
+Get live channel info.
+
+parameters:
+
+- id {String} the channel id
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the channel information.
+
+object:
+
+- data {Object} channel info, same as conf in [.putChannel](#putchannelid-conf-options)
+- res {Object} response info
+
+example:
+
+- Get live channel info
+
+```js
+const cid = 'my-channel';
+
+const r = await this.store.getChannel(cid);
+console.log(r);
+```
+
+### .deleteChannel(id[, options])
+
+Delete a live channel.
+
+parameters:
+
+- id {String} the channel id
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the response infomation.
+
+object:
+
+- res {Object} response info
+
+example:
+
+- Delete a live channel
+
+```js
+const cid = 'my-channel';
+
+const r = await this.store.deleteChannel(cid);
+console.log(r);
+```
+
+### .putChannelStatus(id, status[, options])
+
+Change the live channel status.
+
+parameters:
+
+- id {String} the channel id
+- status {String} the status: 'enabled' or 'disabled'
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the response information.
+
+object:
+
+- res {Object} response info
+
+example:
+
+- Disable a live channel
+
+```js
+const cid = 'my-channel';
+
+const r = await this.store.putChannelStatus(cid, 'disabled');
+console.log(r);
+```
+
+### .getChannelStatus(id[, options])
+
+Get the live channel status.
+
+parameters:
+
+- id {String} the channel id
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the channel status information.
+
+object:
+
+- data {Object}
+  - Status {String} the channel status: 'Live' or 'Idle'
+  - [ConnectedTime] {String} the connected time of rtmp pushing
+  - [RemoteAddr] {String} the remote addr of rtmp pushing
+  - [Video] {Object} the video parameters (Width/Height/FrameRate/Bandwidth/Codec)
+  - [Audio] {Object} the audio parameters (Bandwidth/SampleRate/Codec)
+- res {Object} response info
+
+example:
+
+- Get a live channel status
+
+```js
+const cid = 'my-channel';
+
+const r = await this.store.getChannelStatus(cid);
+console.log(r);
+
+// { Status: 'Live',
+//   ConnectedTime: '2016-04-12T11:51:03.000Z',
+//   RemoteAddr: '42.120.74.98:53931',
+//   Video:
+//   { Width: '672',
+//     Height: '378',
+//     FrameRate: '29',
+//     Bandwidth: '60951',
+//     Codec: 'H264' },
+//   Audio: { Bandwidth: '5959', SampleRate: '22050', Codec: 'AAC' }
+// }
+```
+
+### .listChannels(query[, options])
+
+List channels.
+
+parameters:
+
+- query {Object} parameters for list
+  - prefix {String}: the channel id prefix (returns channels with this prefix)
+  - marker {String}: the channle id marker (returns channels after this id)
+  - max-keys {Number}: max number of channels to return
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the channel list.
+
+object:
+
+- channels {Array} the channels, each in the structure:
+  - Name {String} the channel id
+  - Description {String} the channel description
+  - Status {String} the channel status
+  - LastModified {String} the last modification time of the channel
+  - PublishUrls {Array} the publish urls for the channel
+  - PlayUrls {Array} the play urls for the channel
+- nextMarker: result.data.NextMarker || null,
+- isTruncated: result.data.IsTruncated === 'true'
+- res {Object} response info
+
+example:
+
+- List live channels
+
+```js
+const r = await this.store.listChannels({
+  prefix: 'my-channel',
+  'max-keys': 3
+});
+console.log(r);
+```
+
+### .getChannelHistory(id[, options])
+
+Get the live channel history.
+
+parameters:
+
+- id {String} the channel id
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the history information.
+
+object:
+
+- records {Object} the pushing records, each in the structure:
+  - StartTime {String} the start time
+  - EndTime {String} the end time
+  - RemoteAddr {String} the remote addr
+- res {Object} response info
+
+example:
+
+- Get the live channel history
+
+```js
+const cid = 'my-channel';
+
+const r = await this.store.getChannelHistory(cid);
+console.log(r);
+```
+
+### .createVod(id, name, time[, options])
+
+Create a VOD playlist for the channel.
+
+parameters:
+
+- id {String} the channel id
+- name {String} the playlist name
+- time {Object} the duration time
+  - startTime {Number} the start time in epoch seconds
+  - endTime {Number} the end time in epoch seconds
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the response information.
+
+object:
+
+- res {Object} response info
+
+example:
+
+- Create a vod playlist of a live channel
+
+```js
+const cid = 'my-channel';
+
+const r = await this.store.createVod(cid, 're-play', {
+  startTime: 1460464870,
+  endTime: 1460465877
+});
+console.log(r);
+```
+
+### .getRtmpUrl(channelId[, options])
+
+Get signatured rtmp url for publishing.
+
+parameters:
+
+- channelId {String} the channel id
+- [options] {Object} optional parameters
+  - [expires] {Number} the expire time in seconds of the url
+  - [params] {Object} the additional paramters for url, e.g.: {playlistName: 'play.m3u8'}
+  - [timeout] {Number} the operation timeout
+
+Success will return the rtmp url.
+
+example:
+
+- Get a rtmp url.
+
+```js
+const cid = 'my-channel';
+
+const url = this.store.getRtmpUrl(this.cid, {
+  params: {
+    playlistName: 'play.m3u8'
+  },
+  expires: 3600
+});
+console.log(url);
+// rtmp://ossliveshow.oss-cn-hangzhou.aliyuncs.com/live/tl-channel?OSSAccessKeyId=T0cqQWBk2ThfRS6m&Expires=1460466188&Signature=%2BnzTtpyxUWDuQn924jdS6b51vT8%3D
+```
+
+## Create A Image Service Instance
+
+Each Image Service instance required `accessKeyId`, `accessKeySecret`, `bucket` and `imageHost`.
+
+### oss.ImageClient(options)
+
+Create a Image service instance.
+
+options:
+- imageHost {String} your image service domain that binding to a OSS bucket
+- accessKeyId {String} access key you create on aliyun console website
+- accessKeySecret {String} access secret you create
+- bucket {String} the default bucket you want to access
+  If you don't have any bucket, please use `putBucket()` create one first.
+- [region] {String} the bucket data region location, please see [Data Regions](#data-regions),
+  default is `oss-cn-hangzhou`
+  Current available: `oss-cn-hangzhou`, `oss-cn-qingdao`, `oss-cn-beijing`, `oss-cn-hongkong` and `oss-cn-shenzhen`
+- [internal] {Boolean} access OSS with aliyun internal network or not, default is `false`
+  If your servers are running on aliyun too, you can set `true` to save lot of money.
+- [timeout] {String|Number} instance level timeout for all operations, default is `60s`
+
+example:
+
+```js
+const oss = require('ali-oss');
+
+const imgClient = oss.ImageClient({
+  accessKeyId: 'your access key',
+  accessKeySecret: 'your access secret',
+  bucket: 'my_image_bucket'
+  imageHost: 'thumbnail.myimageservice.com'
+});
+```
+
+## Image Operations
+
+All operations function is [async], except `imgClient.signatureUrl`.
+
+async function format: `async functionName(...)`.
+
+### imgClient.get(name, file[, options])
+
+Get an image from the image channel.
+
+parameters:
+
+- name {String} image object name with operation style store on OSS
+- [file] {String|WriteStream} file path or WriteStream instance to store the image
+  If `file` is null or ignore this parameter, function will return info contains `content` property.
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [headers] {Object} extra headers, detail see [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616.html)
+    - 'If-Modified-Since' object modified after this time will return 200 and object meta,
+        otherwise return 304 not modified
+    - 'If-Unmodified-Since' object modified before this time will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-Match' object etag equal this will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-None-Match' object etag not equal this will return 200 and object meta,
+        otherwise return 304 not modified
+
+Success will return the info contains response.
+
+object:
+
+- [content] {Buffer} file content buffer if `file` parameter is null or ignore
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+If object not exists, will throw NoSuchKeyError.
+
+example:
+
+- Get an exists image with a style and store it to the local file
+
+```js
+const imagepath = '/home/ossdemo/demo.jpg';
+await imgClient.get('ossdemo/demo.jpg@200w_200h', filepath);
+```
+
+_ Store image to a writestream
+
+```js
+await imgClient.get('ossdemo/demo.jpg@200w_200h', somestream);
+```
+
+- Get an image content buffer
+
+```js
+const result = await imgClient.get('ossdemo/demo.jpg@200w_200h');
+console.log(Buffer.isBuffer(result.content));
+```
+
+- Get a not exists object or a not image object
+
+```js
+const imagepath = '/home/ossdemo/demo.jpg';
+await imgClient.get('ossdemo/not-exists-demo.jpg@200w_200h', filepath);
+// will throw NoSuchKeyError
+```
+
+### imgClient.getStream(name[, options])
+
+Get an image read stream.
+
+parameters:
+
+- name {String} image object name with operation style store on OSS
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+  - [headers] {Object} extra headers
+    - 'If-Modified-Since' object modified after this time will return 200 and object meta,
+        otherwise return 304 not modified
+    - 'If-Unmodified-Since' object modified before this time will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-Match' object etag equal this will return 200 and object meta,
+        otherwise throw PreconditionFailedError
+    - 'If-None-Match' object etag not equal this will return 200 and object meta,
+        otherwise return 304 not modified
+
+Success will return the stream instance and response info.
+
+object:
+
+- stream {ReadStream} readable stream instance
+    if response status is not 200, stream will be `null`.
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+
+If object not exists, will throw NoSuchKeyError.
+
+example:
+
+- Get an exists image object stream
+
+```js
+const result = await imgClient.getStream('ossdemo/demo.jpg@200w_200h');
+result.stream.pipe(fs.createWriteStream('some demo.jpg'));
+```
+
+### imgClient.getExif(name[, options])
+
+Get a image exif info by image object name from the image channel.
+
+parameters:
+- name {String} image object name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the info contains response.
+
+object:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- data {Object} image exif object
+
+If object don't have exif, will throw 400 BadRequest.
+
+example:
+
+```js
+const result = await imgClient.getExif('demo.jpg');
+// resut:
+// {
+//   res: {
+//     status: 200,
+//     statusCode: 200,
+//     headers: {
+//       server: "Tengine",
+//       content - type: "application/json",
+//       content - length: "148",
+//       connection: "keep-alive",
+//       date: "Tue, 31 Mar 2015 11:06:32 GMT",
+//       "last-modified": "Mon, 30 Mar 2015 10:46:35 GMT"
+//     },
+//     size: 148,
+//     aborted: false,
+//     rt: 461,
+//     keepAliveSocket: false
+//   },
+//   data: {
+//     FileSize: 343683,
+//     ImageHeight: 1200,
+//     ImageWidth: 1600,
+//     Orientation: 1
+//   }
+// }
+
+```
+
+### imgClient.getInfo(name[, options])
+
+Get a image info and exif info by image object name from the image channel.
+
+parameters:
+- name {String} image object name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the info contains response.
+
+object:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- data {Object} image exif object
+
+example:
+
+```js
+const result = await imgClient.getInfo('demo.jpg');
+// resut:
+// {
+//   res: {
+//     status: 200,
+//     statusCode: 200,
+//     headers: {
+//       server: "Tengine",
+//       content - type: "application/json",
+//       content - length: "148",
+//       connection: "keep-alive",
+//       date: "Tue, 31 Mar 2015 11:06:32 GMT",
+//       "last-modified": "Mon, 30 Mar 2015 10:46:35 GMT"
+//     },
+//     size: 148,
+//     aborted: false,
+//     rt: 461,
+//     keepAliveSocket: false
+//   },
+//   data: {
+//     FileSize: 343683,
+//     Format: "jpg",
+//     ImageHeight: 1200,
+//     ImageWidth: 1600,
+//     Orientation: 1
+//   }
+// }
+
+```
+
+
+### imgClient.putStyle(name, style[, options])
+// TODO
+
+### imgClient.getStyle(name[, options])
+
+Get a style by name from the image channel.
+
+parameters:
+- name {String} image style name
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the info contains response.
+
+object:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- data {Object} styles object
+  - Name {String} style name
+  - Content {String} style content
+  - CreateTime {String} style create time
+  - LastModifyTime {String} style last modify time
+
+example:
+
+```js
+const result = await imgClient.getStyle('400');
+// resut:
+// {
+//   res: {
+//     status: 200,
+//     statusCode: 200,
+//     headers: {
+//       server: "Tengine",
+//       content - type: "application/xml",
+//       content - length: "234",
+//       connection: "keep-alive",
+//       date: "Tue, 31 Mar 2015 10:58:20 GMT"
+//     },
+//     size: 234,
+//     aborted: false,
+//     rt: 398,
+//     keepAliveSocket: false
+//   },
+//   data: {
+//     Name: "400",
+//     Content: "400w_90Q_1x.jpg",
+//     CreateTime: "Thu, 19 Mar 2015 08:34:21 GMT",
+//     LastModifyTime: "Thu, 19 Mar 2015 08:34:21 GMT"
+//   }
+// }
+```
+
+### imgClient.listStyle([options])
+
+Get all styles from the image channel.
+
+parameters:
+- [options] {Object} optional parameters
+  - [timeout] {Number} the operation timeout
+
+Success will return the info contains response.
+
+object:
+
+- res {Object} response info, including
+  - status {Number} response status
+  - headers {Object} response headers
+  - size {Number} response size
+  - rt {Number} request total use time (ms)
+- data {Array} styles array, a style object:
+  - Name {String} style name
+  - Content {String} style content
+  - CreateTime {String} style create time
+  - LastModifyTime {String} style last modify time
+
+example:
+
+```js
+const result = await imgClient.listStyle();
+// resut:
+// {
+//   res: {
+//     status: 200,
+//     statusCode: 200,
+//     headers: {
+//       server: "Tengine",
+//       content - type: "application/xml",
+//       content - length: "913",
+//       connection: "keep-alive",
+//       date: "Tue, 31 Mar 2015 10:47:32 GMT"
+//     },
+//     size: 913,
+//     aborted: false,
+//     rt: 1911,
+//     keepAliveSocket: false
+//   },
+//   data: [{
+//     Name: "200-200",
+//     Content: "0e_200w_200h_0c_0i_0o_90Q_1x.jpg",
+//     CreateTime: "Thu, 19 Mar 2015 08:28:08 GMT",
+//     LastModifyTime: "Thu, 19 Mar 2015 08:28:08 GMT"
+//   }, {
+//     Name: "800",
+//     Content: "800w_90Q_1x.jpg",
+//     CreateTime: "Thu, 19 Mar 2015 08:29:15 GMT",
+//     LastModifyTime: "Thu, 19 Mar 2015 08:29:15 GMT"
+//   }, {
+//     Name: "400",
+//     Content: "400w_90Q_1x.jpg",
+//     CreateTime: "Thu, 19 Mar 2015 08:34:21 GMT",
+//     LastModifyTime: "Thu, 19 Mar 2015 08:34:21 GMT"
+//   }, {
+//     Name: "600",
+//     Content: "600w_90Q_1x.jpg",
+//     CreateTime: "Thu, 19 Mar 2015 08:35:02 GMT",
+//     LastModifyTime: "Thu, 19 Mar 2015 08:35:02 GMT"
+//   }]
+// }
+```
+
+### imgClient.deleteStyle(name[, options])
+// TODO
+
+### imgClient.signatureUrl(name)
+
+Create a signature url for directly download.
+
+parameters:
+
+- name {String} image object name with operation style store on OSS
+- [options] {Object} optional parameters
+  - [expires] {Number} after expires seconds, the url will become invalid, default is `1800`
+  - [timeout] {Number} the operation timeout
+
+Success will return full signature url.
+
+example:
+
+```js
+const url = imgClient.signatureUrl('
+');
+// http://thumbnail.myimageservice.com/demo.jpg@200w_200h?OSSAccessKeyId=uZxyLARzYZtGwHKY&Expires=1427803849&Signature=JSPRe06%2FjQpQSj5zlx2ld1V%2B35I%3D
+```
+
+## Cluster Mode
+
+Cluster mode now only support object operations.
+
+```js
+const Cluster = require('ali-oss').ClusterClient;
+
+const client = Cluster({
+  cluster: [{
+    host: 'host1',
+    accessKeyId: 'id1',
+    accessKeySecret: 'secret1'
+  }, {
+    host: 'host2',
+    accessKeyId: 'id2',
+    accessKeySecret: 'secret2'
+  }],
+  schedule: 'masterSlave', //default is `roundRobin`
+});
+
+// listen error event to logging error
+client.on('error', function(err) {
+  console.error(err.stack);
+});
+
+// client init ready
+client.ready(function() {
+  console.log('cluster client init ready, go ahead!');
+});
+```
+
+### Get Methods
+
+Will choose an alive client by schedule(`masterSlave` or `roundRobin`).
+
+- `client.get()`
+- `client.head()`
+- `client.getStream()`
+- `client.list()`
+- `client.signatureUrl()`
+- `client.chooseAvailable()` - choose an available client by schedule.
+- `client.getACL()`
+
+### Put Methods
+
+Will put to all clients.
+
+- `client.put()`
+- `client.putStream()`
+- `client.delete()`
+- `client.deleteMulti()`
+- `client.copy()`
+- `client.putMeta()`
+- `client.putACL()`
+- `client.restore()`
+
+## Known Errors
+
+Each error return by OSS server will contains these properties:
+
+- name {String} error name
+- message {String} error message
+- requestId {String} uuid for this request, if you meet some unhandled problem,
+    you can send this request id to OSS engineer to find out what's happend.
+- hostId {String} OSS cluster name for this request
+
+The following table lists the OSS error codes:
+
+[More code info](https://help.aliyun.com/knowledge_detail/32005.html)
+
+name | code | status | message | message in Chinese
+---  | ---  | --- | ---     | ---
+AccessDeniedError | AccessDenied | 403 | Access Denied | 拒绝访问
+BucketAlreadyExistsError | BucketAlreadyExists | 409 | Bucket already exists | Bucket 已经存在
+BucketNotEmptyError | BucketNotEmpty | 409 | Bucket is not empty | Bucket 不为空
+RestoreAlreadyInProgressError | RestoreAlreadyInProgress | 409 | The restore operation is in progress. | restore 操作正在进行中
+OperationNotSupportedError | OperationNotSupported | 400 | The operation is not supported for this resource | 该资源暂不支持restore操作
+EntityTooLargeError | EntityTooLarge | 400 | Entity too large | 实体过大
+EntityTooSmallError | EntityTooSmall | 400 | Entity too small | 实体过小
+FileGroupTooLargeError | FileGroupTooLarge | 400 | File group too large | 文件组过大
+InvalidLinkNameError | InvalidLinkName | 400 | Link name can't be the same as the object name | Object Link 与指向的 Object 同名
+LinkPartNotExistError | LinkPartNotExist | 400 | Can't link to not exists object | Object Link 中指向的 Object 不存在
+ObjectLinkTooLargeError | ObjectLinkTooLarge | 400 | Too many links to this object | Object Link 中 Object 个数过多
+FieldItemTooLongError | FieldItemTooLong | 400 | Post form fields items too large | Post 请求中表单域过大
+FilePartInterityError | FilePartInterity | 400 | File part has changed | 文件 Part 已改变
+FilePartNotExistError | FilePartNotExist | 400 | File part not exists | 文件 Part 不存在
+FilePartStaleError | FilePartStale| 400 | File part stale | 文件 Part 过时
+IncorrectNumberOfFilesInPOSTRequestError | IncorrectNumberOfFilesInPOSTRequest | 400 | Post request contains invalid number of files | Post 请求中文件个数非法
+InvalidArgumentError | InvalidArgument | 400 | Invalid format argument | 参数格式错误
+InvalidAccessKeyIdError | InvalidAccessKeyId | 400 | Access key id not exists | Access Key ID 不存在
+InvalidBucketNameError | InvalidBucketName | 400 | Invalid bucket name | 无效的 Bucket 名字
+InvalidDigestError | InvalidDigest | 400 | Invalid digest | 无效的摘要
+InvalidEncryptionAlgorithmError | InvalidEncryptionAlgorithm | 400 | Invalid encryption algorithm | 指定的熵编码加密算法错误
+InvalidObjectNameError | InvalidObjectName | 400 | Invalid object name | 无效的 Object 名字
+InvalidPartError | InvalidPart | 400 | Invalid part | 无效的 Part
+InvalidPartOrderError | InvalidPartOrder | 400 | Invalid part order | 无效的 part 顺序
+InvalidPolicyDocumentError | InvalidPolicyDocument | 400 | Invalid policy document | 无效的 Policy 文档
+InvalidTargetBucketForLoggingError | InvalidTargetBucketForLogging | 400 | Invalid bucket on logging operation | Logging 操作中有无效的目标 bucket
+InternalError | Internal | 500 | OSS server internal error | OSS 内部发生错误
+MalformedXMLError | MalformedXML | 400 | Malformed XML format | XML 格式非法
+MalformedPOSTRequestError | MalformedPOSTRequest | 400 | Invalid post body format | Post 请求的 body 格式非法
+MaxPOSTPreDataLengthExceededError | MaxPOSTPreDataLengthExceeded | 400 | Post extra data too large | Post 请求上传文件内容之外的 body 过大
+MethodNotAllowedError | MethodNotAllowed | 405 | Not allowed method | 不支持的方法
+MissingArgumentError | MissingArgument | 411 | Missing argument | 缺少参数
+MissingContentLengthError | MissingContentLength | 411 | Missing `Content-Length` header | 缺少内容长度
+NoSuchBucketError | NoSuchBucket | 404 | Bucket not exists | Bucket 不存在
+NoSuchKeyError | NoSuchKey | 404 | Object not exists | 文件不存在
+NoSuchUploadError | NoSuchUpload | 404 | Multipart upload id not exists | Multipart Upload ID 不存在
+NotImplementedError | NotImplemented | 501 | Not implemented | 无法处理的方法
+PreconditionFailedError | PreconditionFailed | 412 | Pre condition failed | 预处理错误
+RequestTimeTooSkewedError | RequestTimeTooSkewed | 403 | Request time exceeds 15 minutes to server time | 发起请求的时间和服务器时间超出 15 分钟
+RequestTimeoutError | RequestTimeout | 400 | Request timeout | 请求超时
+RequestIsNotMultiPartContentError | RequestIsNotMultiPartContent | 400 | Invalid post content-type | Post 请求 content-type 非法
+SignatureDoesNotMatchError | SignatureDoesNotMatch | 403 | Invalid signature | 签名错误
+TooManyBucketsError | TooManyBuckets | 400 | Too many buckets on this user | 用户的 Bucket 数目超过限制
+RequestError | RequestError | -1 | network error | 网络出现中断或异常
+ConnectionTimeoutError | ConnectionTimeoutError | -2 | request connect timeout | 请求连接超时
+SecurityTokenExpiredError | SecurityTokenExpired | 403 | sts Security Token Expired | sts Security Token 超时失效
+
+[generator]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
+[oss-sts]: https://help.aliyun.com/document_detail/oss/practice/ram_guide.html
+[browser-sample]: https://github.com/rockuw/oss-in-browser
+[oss-multipart]: https://help.aliyun.com/document_detail/31992.html
+[disabled-browser-headers]: https://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method

Diferenças do arquivo suprimidas por serem muito extensas
+ 1978 - 0
node_modules/ali-oss/dist/aliyun-oss-sdk.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 3 - 0
node_modules/ali-oss/dist/aliyun-oss-sdk.min.js


+ 6 - 0
node_modules/ali-oss/lib/browser.js

@@ -0,0 +1,6 @@
+const OSS = require('./browser/client');
+OSS.Buffer = require('buffer').Buffer;
+OSS.urllib = require('../shims/xhr');
+OSS.version = require('./browser/version').version;
+
+module.exports = OSS;

+ 297 - 0
node_modules/ali-oss/lib/browser/bucket.js

@@ -0,0 +1,297 @@
+
+const assert = require('assert');
+const { checkBucketName: _checkBucketName } = require('../common/utils/checkBucketName');
+
+const proto = exports;
+
+function isArray(arr) {
+  if (Array.isArray) return Array.isArray(arr);
+  return Object.prototype.toString.call(arr) === '[object Array]';
+}
+
+function toArray(obj) {
+  if (!obj) return [];
+  if (isArray(obj)) return obj;
+  return [obj];
+}
+
+/**
+ * Bucket opertaions
+ */
+
+// TODO: OSS server currently do not support CORS requests for bucket operations
+// proto.listBuckets = function* listBuckets(query, options) {
+//   // prefix, marker, max-keys
+//   var result = yield this.request({
+//     method: 'GET',
+//     query: query,
+//     timeout: options && options.timeout,
+//     ctx: options && options.ctx,
+//   });
+//
+//   if (result.status === 200) {
+//     var data = yield this.parseXML(result.data);
+//     var buckets = data.Buckets || null;
+//     if (buckets) {
+//       if (buckets.Bucket) {
+//         buckets = buckets.Bucket;
+//       }
+//       if (!isArray(buckets)) {
+//         buckets = [buckets];
+//       }
+//       buckets = buckets.map(function (item) {
+//         return {
+//           name: item.Name,
+//           region: item.Location,
+//           creationDate: item.CreationDate,
+//         };
+//       });
+//     }
+//     return {
+//       buckets: buckets,
+//       owner: {
+//         id: data.Owner.ID,
+//         displayName: data.Owner.DisplayName,
+//       },
+//       isTruncated: data.IsTruncated === 'true',
+//       nextMarker: data.NextMarker || null,
+//       res: result.res
+//     };
+//   }
+//
+//   throw yield this.requestError(result);
+// };
+
+proto.useBucket = function useBucket(name) {
+  _checkBucketName(name);
+  this.options.bucket = name;
+  return this;
+};
+
+proto.setBucket = function useBucket(name) {
+  _checkBucketName(name);
+  this.options.bucket = name;
+  return this;
+};
+
+proto.getBucket = function getBucket() {
+  return this.options.bucket;
+};
+
+proto.deleteBucket = async function deleteBucket(name, options) {
+  const params = this._bucketRequestParams('DELETE', name, '', options);
+  const result = await this.request(params);
+  if (result.status === 200 || result.status === 204) {
+    return {
+      res: result.res
+    };
+  }
+  throw await this.requestError(result);
+};
+
+// acl
+
+proto.putBucketACL = async function putBucketACL(name, acl, options) {
+  const params = this._bucketRequestParams('PUT', name, 'acl', options);
+  params.headers = {
+    'x-oss-acl': acl
+  };
+  params.successStatuses = [200];
+  const result = await this.request(params);
+  return {
+    bucket: (result.headers.location && result.headers.location.substring(1)) || null,
+    res: result.res
+  };
+};
+
+proto.getBucketACL = async function getBucketACL(name, options) {
+  const params = this._bucketRequestParams('GET', name, 'acl', options);
+  params.successStatuses = [200];
+  params.xmlResponse = true;
+  const result = await this.request(params);
+  return {
+    acl: result.data.AccessControlList.Grant,
+    owner: {
+      id: result.data.Owner.ID,
+      displayName: result.data.Owner.DisplayName
+    },
+    res: result.res
+  };
+};
+
+// logging
+
+proto.putBucketLogging = async function putBucketLogging(name, prefix, options) {
+  const params = this._bucketRequestParams('PUT', name, 'logging', options);
+  let xml = `${'<?xml version="1.0" encoding="UTF-8"?>\n<BucketLoggingStatus>\n' +
+    '<LoggingEnabled>\n<TargetBucket>'}${name}</TargetBucket>\n`;
+  if (prefix) {
+    xml += `<TargetPrefix>${prefix}</TargetPrefix>\n`;
+  }
+  xml += '</LoggingEnabled>\n</BucketLoggingStatus>';
+  params.content = xml;
+  params.mime = 'xml';
+  params.successStatuses = [200];
+  const result = await this.request(params);
+  return {
+    res: result.res
+  };
+};
+
+proto.getBucketLogging = async function getBucketLogging(name, options) {
+  const params = this._bucketRequestParams('GET', name, 'logging', options);
+  params.successStatuses = [200];
+  params.xmlResponse = true;
+  const result = await this.request(params);
+  const enable = result.data.LoggingEnabled;
+  return {
+    enable: !!enable,
+    prefix: (enable && enable.TargetPrefix) || null,
+    res: result.res
+  };
+};
+
+proto.deleteBucketLogging = async function deleteBucketLogging(name, options) {
+  const params = this._bucketRequestParams('DELETE', name, 'logging', options);
+  params.successStatuses = [204, 200];
+  const result = await this.request(params);
+  return {
+    res: result.res
+  };
+};
+
+proto.putBucketCORS = async function putBucketCORS(name, rules, options) {
+  rules = rules || [];
+  assert(rules.length, 'rules is required');
+  rules.forEach((rule) => {
+    assert(rule.allowedOrigin, 'allowedOrigin is required');
+    assert(rule.allowedMethod, 'allowedMethod is required');
+  });
+
+  const params = this._bucketRequestParams('PUT', name, 'cors', options);
+  let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<CORSConfiguration>';
+  const parseOrigin = (val) => {
+    xml += `<AllowedOrigin>${val}</AllowedOrigin>`;
+  };
+  const parseMethod = (val) => {
+    xml += `<AllowedMethod>${val}</AllowedMethod>`;
+  };
+  const parseHeader = (val) => {
+    xml += `<AllowedHeader>${val}</AllowedHeader>`;
+  };
+  const parseExposeHeader = (val) => {
+    xml += `<ExposeHeader>${val}</ExposeHeader>`;
+  };
+  for (let i = 0, l = rules.length; i < l; i++) {
+    const rule = rules[i];
+    xml += '<CORSRule>';
+
+    toArray(rule.allowedOrigin).forEach(parseOrigin);
+    toArray(rule.allowedMethod).forEach(parseMethod);
+    toArray(rule.allowedHeader).forEach(parseHeader);
+    toArray(rule.exposeHeader).forEach(parseExposeHeader);
+    if (rule.maxAgeSeconds) {
+      xml += `<MaxAgeSeconds>${rule.maxAgeSeconds}</MaxAgeSeconds>`;
+    }
+    xml += '</CORSRule>';
+  }
+  xml += '</CORSConfiguration>';
+  params.content = xml;
+  params.mime = 'xml';
+  params.successStatuses = [200];
+  const result = await this.request(params);
+  return {
+    res: result.res
+  };
+};
+
+proto.getBucketCORS = async function getBucketCORS(name, options) {
+  const params = this._bucketRequestParams('GET', name, 'cors', options);
+  params.successStatuses = [200];
+  params.xmlResponse = true;
+  const result = await this.request(params);
+  const rules = [];
+  if (result.data && result.data.CORSRule) {
+    let { CORSRule } = result.data;
+    if (!isArray(CORSRule)) CORSRule = [CORSRule];
+    CORSRule.forEach((rule) => {
+      const r = {};
+      Object.keys(rule).forEach((key) => {
+        r[key.slice(0, 1).toLowerCase() + key.slice(1, key.length)] = rule[key];
+      });
+      rules.push(r);
+    });
+  }
+  return {
+    rules,
+    res: result.res
+  };
+};
+
+proto.deleteBucketCORS = async function deleteBucketCORS(name, options) {
+  const params = this._bucketRequestParams('DELETE', name, 'cors', options);
+  params.successStatuses = [204];
+  const result = await this.request(params);
+  return {
+    res: result.res
+  };
+};
+
+// referer
+
+proto.putBucketReferer = async function putBucketReferer(name, allowEmpty, referers, options) {
+  const params = this._bucketRequestParams('PUT', name, 'referer', options);
+  let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<RefererConfiguration>\n';
+  xml += `  <AllowEmptyReferer>${allowEmpty ? 'true' : 'false'}</AllowEmptyReferer>\n`;
+  if (referers && referers.length > 0) {
+    xml += '  <RefererList>\n';
+    for (let i = 0; i < referers.length; i++) {
+      xml += `    <Referer>${referers[i]}</Referer>\n`;
+    }
+    xml += '  </RefererList>\n';
+  } else {
+    xml += '  <RefererList />\n';
+  }
+  xml += '</RefererConfiguration>';
+  params.content = xml;
+  params.mime = 'xml';
+  params.successStatuses = [200];
+  const result = await this.request(params);
+  return {
+    res: result.res
+  };
+};
+
+proto.getBucketReferer = async function getBucketReferer(name, options) {
+  const params = this._bucketRequestParams('GET', name, 'referer', options);
+  params.successStatuses = [200];
+  params.xmlResponse = true;
+  const result = await this.request(params);
+  let referers = result.data.RefererList.Referer || null;
+  if (referers) {
+    if (!isArray(referers)) {
+      referers = [referers];
+    }
+  }
+  return {
+    allowEmpty: result.data.AllowEmptyReferer === 'true',
+    referers,
+    res: result.res
+  };
+};
+
+proto.deleteBucketReferer = async function deleteBucketReferer(name, options) {
+  return await this.putBucketReferer(name, true, null, options);
+};
+
+// private apis
+
+proto._bucketRequestParams = function _bucketRequestParams(method, bucket, subres, options) {
+  return {
+    method,
+    bucket,
+    subres,
+    timeout: options && options.timeout,
+    ctx: options && options.ctx
+  };
+};

+ 403 - 0
node_modules/ali-oss/lib/browser/client.js

@@ -0,0 +1,403 @@
+const debug = require('debug')('ali-oss');
+const xml = require('xml2js');
+const AgentKeepalive = require('agentkeepalive');
+const merge = require('merge-descriptors');
+const platform = require('platform');
+const utility = require('utility');
+const urllib = require('urllib');
+const pkg = require('./version');
+const bowser = require('bowser');
+const signUtils = require('../common/signUtils');
+const _initOptions = require('../common/client/initOptions');
+const { createRequest } = require('../common/utils/createRequest');
+const { encoder } = require('../common/utils/encoder');
+const { getReqUrl } = require('../common/client/getReqUrl');
+const { setSTSToken } = require('../common/utils/setSTSToken');
+const { retry } = require('../common/utils/retry');
+const { isFunction } = require('../common/utils/isFunction');
+
+const globalHttpAgent = new AgentKeepalive();
+
+function _unSupportBrowserTip() {
+  const { name, version } = platform;
+  if (name && name.toLowerCase && name.toLowerCase() === 'ie' && version.split('.')[0] < 10) {
+    // eslint-disable-next-line no-console
+    console.warn('ali-oss does not support the current browser');
+  }
+}
+// check local web protocol,if https secure default set true , if http secure default set false
+function isHttpsWebProtocol() {
+  // for web worker not use window.location.
+  // eslint-disable-next-line no-restricted-globals
+  return location && location.protocol === 'https:';
+}
+
+function Client(options, ctx) {
+  _unSupportBrowserTip();
+  if (!(this instanceof Client)) {
+    return new Client(options, ctx);
+  }
+  if (options && options.inited) {
+    this.options = options;
+  } else {
+    this.options = Client.initOptions(options);
+  }
+
+  this.options.cancelFlag = false;// cancel flag: if true need to be cancelled, default false
+
+  // support custom agent and urllib client
+  if (this.options.urllib) {
+    this.urllib = this.options.urllib;
+  } else {
+    this.urllib = urllib;
+    this.agent = this.options.agent || globalHttpAgent;
+  }
+  this.ctx = ctx;
+  this.userAgent = this._getUserAgent();
+  this.stsTokenFreshTime = new Date();
+
+  // record the time difference between client and server
+  this.options.amendTimeSkewed = 0;
+}
+
+/**
+ * Expose `Client`
+ */
+
+module.exports = Client;
+
+Client.initOptions = function initOptions(options) {
+  if (!options.stsToken) {
+    console.warn('Please use STS Token for safety, see more details at https://help.aliyun.com/document_detail/32077.html');
+  }
+  const opts = Object.assign({
+    secure: isHttpsWebProtocol(),
+    // for browser compatibility disable fetch.
+    useFetch: false,
+  }, options);
+
+  return _initOptions(opts);
+};
+
+
+/**
+ * prototype
+ */
+
+const proto = Client.prototype;
+
+// mount debug on proto
+proto.debug = debug;
+
+/**
+ * Object operations
+ */
+merge(proto, require('./object'));
+/**
+ * Bucket operations
+ */
+merge(proto, require('./bucket'));
+merge(proto, require('../common/bucket/getBucketWebsite'));
+merge(proto, require('../common/bucket/putBucketWebsite'));
+merge(proto, require('../common/bucket/deleteBucketWebsite'));
+
+// lifecycle
+merge(proto, require('../common/bucket/getBucketLifecycle'));
+merge(proto, require('../common/bucket/putBucketLifecycle'));
+merge(proto, require('../common/bucket/deleteBucketLifecycle'));
+
+// multiversion
+merge(proto, require('../common/bucket/putBucketVersioning'));
+merge(proto, require('../common/bucket/getBucketVersioning'));
+
+// inventory
+merge(proto, require('../common/bucket/getBucketInventory'));
+merge(proto, require('../common/bucket/deleteBucketInventory'));
+merge(proto, require('../common/bucket/listBucketInventory'));
+merge(proto, require('../common/bucket/putBucketInventory'));
+
+// worm
+merge(proto, require('../common/bucket/abortBucketWorm'));
+merge(proto, require('../common/bucket/completeBucketWorm'));
+merge(proto, require('../common/bucket/extendBucketWorm'));
+merge(proto, require('../common/bucket/getBucketWorm'));
+merge(proto, require('../common/bucket/initiateBucketWorm'));
+
+// multipart upload
+merge(proto, require('./managed-upload'));
+/**
+ * common multipart-copy support node and browser
+ */
+merge(proto, require('../common/multipart-copy'));
+/**
+ * Multipart operations
+ */
+merge(proto, require('../common/multipart'));
+
+/**
+ * Common module parallel
+ */
+merge(proto, require('../common/parallel'));
+
+/**
+ * get OSS signature
+ * @param {String} stringToSign
+ * @return {String} the signature
+ */
+proto.signature = function signature(stringToSign) {
+  this.debug('authorization stringToSign: %s', stringToSign, 'info');
+
+  return signUtils.computeSignature(this.options.accessKeySecret, stringToSign, this.options.headerEncoding);
+};
+
+proto._getReqUrl = getReqUrl;
+
+/**
+ * get author header
+ *
+ * "Authorization: OSS " + Access Key Id + ":" + Signature
+ *
+ * Signature = base64(hmac-sha1(Access Key Secret + "\n"
+ *  + VERB + "\n"
+ *  + CONTENT-MD5 + "\n"
+ *  + CONTENT-TYPE + "\n"
+ *  + DATE + "\n"
+ *  + CanonicalizedOSSHeaders
+ *  + CanonicalizedResource))
+ *
+ * @param {String} method
+ * @param {String} resource
+ * @param {Object} header
+ * @return {String}
+ *
+ * @api private
+ */
+
+proto.authorization = function authorization(method, resource, subres, headers) {
+  const stringToSign = signUtils.buildCanonicalString(method.toUpperCase(), resource, {
+    headers,
+    parameters: subres
+  });
+
+  return signUtils.authorization(this.options.accessKeyId, this.options.accessKeySecret, stringToSign, this.options.headerEncoding);
+};
+
+/**
+ * request oss server
+ * @param {Object} params
+ *   - {String} object
+ *   - {String} bucket
+ *   - {Object} [headers]
+ *   - {Object} [query]
+ *   - {Buffer} [content]
+ *   - {Stream} [stream]
+ *   - {Stream} [writeStream]
+ *   - {String} [mime]
+ *   - {Boolean} [xmlResponse]
+ *   - {Boolean} [customResponse]
+ *   - {Number} [timeout]
+ *   - {Object} [ctx] request context, default is `this.ctx`
+ *
+ * @api private
+ */
+
+proto.request = async function (params) {
+  if (this.options.retryMax) {
+    return await retry(request.bind(this), this.options.retryMax, {
+      errorHandler: (err) => {
+        const _errHandle = (_err) => {
+          if (params.stream) return false;
+          const statusErr = [-1, -2].includes(_err.status);
+          const requestErrorRetryHandle = this.options.requestErrorRetryHandle || (() => true);
+          return statusErr && requestErrorRetryHandle(_err);
+        };
+        if (_errHandle(err)) return true;
+        return false;
+      }
+    })(params);
+  } else {
+    return request.call(this, params);
+  }
+};
+
+async function request(params) {
+  if (this.options.stsToken && isFunction(this.options.refreshSTSToken)) {
+    await setSTSToken.call(this);
+  }
+  const reqParams = createRequest.call(this, params);
+  if (!this.options.useFetch) {
+    reqParams.params.mode = 'disable-fetch';
+  }
+  let result;
+  let reqErr;
+  const useStream = !!params.stream;
+  try {
+    result = await this.urllib.request(reqParams.url, reqParams.params);
+    this.debug('response %s %s, got %s, headers: %j', params.method, reqParams.url, result.status, result.headers, 'info');
+  } catch (err) {
+    reqErr = err;
+  }
+  let err;
+  if (result && params.successStatuses && params.successStatuses.indexOf(result.status) === -1) {
+    err = await this.requestError(result);
+    // not use stream
+    if (err.code === 'RequestTimeTooSkewed' && !useStream) {
+      this.options.amendTimeSkewed = +new Date(err.serverTime) - new Date();
+      return await this.request(params);
+    }
+    err.params = params;
+  } else if (reqErr) {
+    err = await this.requestError(reqErr);
+  }
+
+  if (err) {
+    throw err;
+  }
+
+  if (params.xmlResponse) {
+    const parseData = await this.parseXML(result.data);
+    result.data = parseData;
+  }
+  return result;
+}
+
+proto._getResource = function _getResource(params) {
+  let resource = '/';
+  if (params.bucket) resource += `${params.bucket}/`;
+  if (params.object) resource += encoder(params.object, this.options.headerEncoding);
+
+  return resource;
+};
+
+proto._escape = function _escape(name) {
+  return utility.encodeURIComponent(name).replace(/%2F/g, '/');
+};
+
+/*
+ * Get User-Agent for browser & node.js
+ * @example
+ *   aliyun-sdk-nodejs/4.1.2 Node.js 5.3.0 on Darwin 64-bit
+ *   aliyun-sdk-js/4.1.2 Safari 9.0 on Apple iPhone(iOS 9.2.1)
+ *   aliyun-sdk-js/4.1.2 Chrome 43.0.2357.134 32-bit on Windows Server 2008 R2 / 7 64-bit
+ */
+
+proto._getUserAgent = function _getUserAgent() {
+  const agent = (process && process.browser) ? 'js' : 'nodejs';
+  const sdk = `aliyun-sdk-${agent}/${pkg.version}`;
+  let plat = platform.description;
+  if (!plat && process) {
+    plat = `Node.js ${process.version.slice(1)} on ${process.platform} ${process.arch}`;
+  }
+
+  return this._checkUserAgent(`${sdk} ${plat}`);
+};
+
+proto._checkUserAgent = function _checkUserAgent(ua) {
+  const userAgent = ua.replace(/\u03b1/, 'alpha').replace(/\u03b2/, 'beta');
+  return userAgent;
+};
+
+/*
+ * Check Browser And Version
+ * @param {String} [name] browser name: like IE, Chrome, Firefox
+ * @param {String} [version] browser major version: like 10(IE 10.x), 55(Chrome 55.x), 50(Firefox 50.x)
+ * @return {Bool} true or false
+ * @api private
+ */
+
+proto.checkBrowserAndVersion = function checkBrowserAndVersion(name, version) {
+  return ((bowser.name === name) && (bowser.version.split('.')[0] === version));
+};
+
+/**
+ * thunkify xml.parseString
+ * @param {String|Buffer} str
+ *
+ * @api private
+ */
+
+proto.parseXML = function parseXMLThunk(str) {
+  return new Promise((resolve, reject) => {
+    if (Buffer.isBuffer(str)) {
+      str = str.toString();
+    }
+    xml.parseString(str, {
+      explicitRoot: false,
+      explicitArray: false
+    }, (err, result) => {
+      if (err) {
+        reject(err);
+      } else {
+        resolve(result);
+      }
+    });
+  });
+};
+
+/**
+ * generater a request error with request response
+ * @param {Object} result
+ *
+ * @api private
+ */
+
+proto.requestError = async function requestError(result) {
+  let err = null;
+  if (!result.data || !result.data.length) {
+    if (result.status === -1 || result.status === -2) { // -1 is net error , -2 is timeout
+      err = new Error(result.message);
+      err.name = result.name;
+      err.status = result.status;
+      err.code = result.name;
+    } else {
+      // HEAD not exists resource
+      if (result.status === 404) {
+        err = new Error('Object not exists');
+        err.name = 'NoSuchKeyError';
+        err.status = 404;
+        err.code = 'NoSuchKey';
+      } else if (result.status === 412) {
+        err = new Error('Pre condition failed');
+        err.name = 'PreconditionFailedError';
+        err.status = 412;
+        err.code = 'PreconditionFailed';
+      } else {
+        err = new Error(`Unknow error, status: ${result.status}`);
+        err.name = 'UnknowError';
+        err.status = result.status;
+      }
+      err.requestId = result.headers['x-oss-request-id'];
+      err.host = '';
+    }
+  } else {
+    const message = String(result.data);
+    this.debug('request response error data: %s', message, 'error');
+
+    let info;
+    try {
+      info = await this.parseXML(message) || {};
+    } catch (error) {
+      this.debug(message, 'error');
+      error.message += `\nraw xml: ${message}`;
+      error.status = result.status;
+      error.requestId = result.headers['x-oss-request-id'];
+      return error;
+    }
+
+    let msg = info.Message || (`unknow request error, status: ${result.status}`);
+    if (info.Condition) {
+      msg += ` (condition: ${info.Condition})`;
+    }
+    err = new Error(msg);
+    err.name = info.Code ? `${info.Code}Error` : 'UnknowError';
+    err.status = result.status;
+    err.code = info.Code;
+    err.requestId = info.RequestId;
+    err.hostId = info.HostId;
+    err.serverTime = info.ServerTime;
+  }
+
+  this.debug('generate error %j', err, 'error');
+  return err;
+};
+

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff