Your Name 1 month ago
commit
3688f4cf10
100 changed files with 38445 additions and 0 deletions
  1. 7 0
      .env.dev.js
  2. 23 0
      .gitignore
  3. 31 0
      .hbuilderx/launch.json
  4. 19 0
      README.md
  5. 63 0
      babel.config.js
  6. 7 0
      env.prd.js
  7. BIN
      nativeplugins/SandPayTypeModule/android/SandbaoSps.aar
  8. BIN
      nativeplugins/SandPayTypeModule/android/dev/paytypesdk-uat-1.0.0.aar
  9. BIN
      nativeplugins/SandPayTypeModule/android/libs/UPPayAssistEx.jar
  10. BIN
      nativeplugins/SandPayTypeModule/android/libs/arm64-v8a/libentryexpro.so
  11. BIN
      nativeplugins/SandPayTypeModule/android/libs/armeabi-v7a/libentryexpro.so
  12. BIN
      nativeplugins/SandPayTypeModule/android/libs/x86/libentryexpro.so
  13. BIN
      nativeplugins/SandPayTypeModule/android/paytypesdk-uat-1.0.0.aar
  14. BIN
      nativeplugins/SandPayTypeModule/android/pro/paytypesdk-1.0.0.aar
  15. 30 0
      nativeplugins/SandPayTypeModule/package.json
  16. 18257 0
      package-lock.json
  17. 123 0
      package.json
  18. 22 0
      postcss.config.js
  19. 29 0
      public/index.html
  20. 339 0
      src/App.vue
  21. 120 0
      src/common/aliyun.js
  22. 272 0
      src/common/api.ts
  23. 36 0
      src/common/constants.ts
  24. 38 0
      src/common/error.ts
  25. 22 0
      src/common/http/config.ts
  26. 159 0
      src/common/http/http.ts
  27. 17 0
      src/common/http/index.ts
  28. 5379 0
      src/common/jsencrypt.js
  29. 399 0
      src/common/mixins/canvasMixin.ts
  30. 42 0
      src/common/mixins/loginMixin.ts
  31. 0 0
      src/common/qqMap.js
  32. 1122 0
      src/common/qqmap-wx-jssdk.js
  33. 0 0
      src/common/qqmap-wx-jssdk.min.js
  34. 211 0
      src/common/store/base/index.ts
  35. 45 0
      src/common/store/canvas/index.ts
  36. 29 0
      src/common/store/index.ts
  37. 56 0
      src/common/store/types.ts
  38. 143 0
      src/common/utils.ts
  39. 4 0
      src/common/weapp.qrcode.min.js
  40. 215 0
      src/components/AddressPopup/AddressPopup.vue
  41. 162 0
      src/components/AppShare/AppShare.vue
  42. 94 0
      src/components/BottomPopup/BottomPopup.vue
  43. 197 0
      src/components/GoodItem/GoodItem.vue
  44. 218 0
      src/components/GoodsShare/GoodsShare.vue
  45. 42 0
      src/components/IconText/IconText.vue
  46. 539 0
      src/components/IconText/demo.css
  47. 1499 0
      src/components/IconText/demo_index.html
  48. 243 0
      src/components/IconText/iconfont.css
  49. 0 0
      src/components/IconText/iconfont.js
  50. 408 0
      src/components/IconText/iconfont.json
  51. BIN
      src/components/IconText/iconfont.ttf
  52. BIN
      src/components/IconText/iconfont.woff
  53. BIN
      src/components/IconText/iconfont.woff2
  54. 192 0
      src/components/ImgUpload/ImgUpload.vue
  55. 245 0
      src/components/LiveItem/LiveItem.vue
  56. 216 0
      src/components/LiveShare/LiveShare.vue
  57. 359 0
      src/components/MiniSpec/MiniSpec.vue
  58. 193 0
      src/components/MulImgUpload/MulImgUpload.vue
  59. 173 0
      src/components/MulVideoUpload/MulVideoUpload.vue
  60. 237 0
      src/components/Navbar/Navbar.vue
  61. 94 0
      src/components/NoData/NoData.vue
  62. 184 0
      src/components/OrderItem/OrderItem.vue
  63. 229 0
      src/components/Password/Password.vue
  64. 157 0
      src/components/SearchBox/SearchBox.vue
  65. 162 0
      src/components/ShopShare/ShopShare.vue
  66. 140 0
      src/components/ShowModal/ShowModal.vue
  67. 266 0
      src/components/SmsCode/SmsCode.vue
  68. 528 0
      src/components/SpecPopup/SpecPopup.vue
  69. 191 0
      src/components/Stepper/Stepper.vue
  70. 59 0
      src/components/SwiperBanner/SwiperBanner.md
  71. 258 0
      src/components/SwiperBanner/SwiperBanner.vue
  72. 246 0
      src/components/SwiperBanner1/SwiperBanner1.vue
  73. 137 0
      src/components/TabBar/TabBar.vue
  74. 192 0
      src/components/Tabs/Tabs.vue
  75. 28 0
      src/components/gaoyia-parse/components/wxParseAudio.vue
  76. 94 0
      src/components/gaoyia-parse/components/wxParseImg.vue
  77. 55 0
      src/components/gaoyia-parse/components/wxParseTable.vue
  78. 98 0
      src/components/gaoyia-parse/components/wxParseTemplate0.vue
  79. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate1.vue
  80. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate10.vue
  81. 86 0
      src/components/gaoyia-parse/components/wxParseTemplate11.vue
  82. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate2.vue
  83. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate3.vue
  84. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate4.vue
  85. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate5.vue
  86. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate6.vue
  87. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate7.vue
  88. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate8.vue
  89. 88 0
      src/components/gaoyia-parse/components/wxParseTemplate9.vue
  90. 15 0
      src/components/gaoyia-parse/components/wxParseVideo.vue
  91. 261 0
      src/components/gaoyia-parse/libs/html2json.js
  92. 156 0
      src/components/gaoyia-parse/libs/htmlparser.js
  93. 209 0
      src/components/gaoyia-parse/libs/wxDiscode.js
  94. 258 0
      src/components/gaoyia-parse/parse.css
  95. 228 0
      src/components/gaoyia-parse/parse.vue
  96. 21 0
      src/main.ts
  97. 308 0
      src/manifest.json
  98. 105 0
      src/packages/classroom/classroom-detail.vue
  99. 271 0
      src/packages/classroom/classroom-list.vue
  100. 253 0
      src/packages/goods/category.vue

+ 7 - 0
.env.dev.js

@@ -0,0 +1,7 @@
+module.exports = {
+  VUE_APP_USER_NAME: 'qyjj',
+  VUE_APP_REMOTE_HOST: 'qyjj-api-dev-go.datounet.com',
+  // VUE_APP_REMOTE_HOST: 'iry-api.datouit.com',
+  
+  // wxc97c3ed1a252a5aa
+}

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+.DS_Store
+node_modules/
+unpackage/
+dist/
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.project
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*

+ 31 - 0
.hbuilderx/launch.json

@@ -0,0 +1,31 @@
+{
+    // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+    // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version" : "0.0",
+    "configurations" : [
+        {
+            "app-plus" : {
+                "launchtype" : "local"
+            },
+            "default" : {
+                "launchtype" : "local"
+            },
+            "h5" : {
+                "launchtype" : "local"
+            },
+            "mp-weixin" : {
+                "launchtype" : "local"
+            },
+            "type" : "uniCloud"
+        },
+        {
+            "openVueDevtools" : true,
+            "playground" : "custom",
+            "type" : "uni-app:app-android"
+        },
+        {
+            "openVueDevtools" : true,
+            "type" : "uni-app:app-ios"
+        }
+    ]
+}

+ 19 - 0
README.md

@@ -0,0 +1,19 @@
+# uni-app-base
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 63 - 0
babel.config.js

@@ -0,0 +1,63 @@
+const plugins = []
+
+if (process.env.UNI_OPT_TREESHAKINGNG) {
+  plugins.push(require('@dcloudio/vue-cli-plugin-uni-optimize/packages/babel-plugin-uni-api/index.js'))
+}
+
+if (
+  (
+    process.env.UNI_PLATFORM === 'app-plus' &&
+    process.env.UNI_USING_V8
+  ) ||
+  (
+    process.env.UNI_PLATFORM === 'h5' &&
+    process.env.UNI_H5_BROWSER === 'builtin'
+  )
+) {
+  const path = require('path')
+
+  const isWin = /^win/.test(process.platform)
+
+  const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path)
+
+  const input = normalizePath(process.env.UNI_INPUT_DIR)
+  try {
+    plugins.push([
+      require('@dcloudio/vue-cli-plugin-hbuilderx/packages/babel-plugin-console'),
+      {
+        file (file) {
+          file = normalizePath(file)
+          if (file.indexOf(input) === 0) {
+            return path.relative(input, file)
+          }
+          return false
+        }
+      }
+    ])
+  } catch (e) {}
+}
+
+process.UNI_LIBRARIES = process.UNI_LIBRARIES || ['@dcloudio/uni-ui']
+process.UNI_LIBRARIES.forEach(libraryName => {
+  plugins.push([
+    'import',
+    {
+      'libraryName': libraryName,
+      'customName': (name) => {
+        return `${libraryName}/lib/${name}/${name}`
+      }
+    }
+  ])
+})
+module.exports = {
+  presets: [
+    [
+      '@vue/app',
+      {
+        modules: 'commonjs',
+        useBuiltIns: process.env.UNI_PLATFORM === 'h5' ? 'usage' : 'entry'
+      }
+    ]
+  ],
+  plugins
+}

+ 7 - 0
env.prd.js

@@ -0,0 +1,7 @@
+module.exports = {
+  VUE_APP_USER_NAME: 'hyx',
+  // VUE_APP_REMOTE_HOST: 'api.qyjj.com',
+  VUE_APP_REMOTE_HOST: 'qyjj-api-dev-go.datounet.com',
+  
+  // appid wxb8052a2a2506e1d8
+}

BIN
nativeplugins/SandPayTypeModule/android/SandbaoSps.aar


BIN
nativeplugins/SandPayTypeModule/android/dev/paytypesdk-uat-1.0.0.aar


BIN
nativeplugins/SandPayTypeModule/android/libs/UPPayAssistEx.jar


BIN
nativeplugins/SandPayTypeModule/android/libs/arm64-v8a/libentryexpro.so


BIN
nativeplugins/SandPayTypeModule/android/libs/armeabi-v7a/libentryexpro.so


BIN
nativeplugins/SandPayTypeModule/android/libs/x86/libentryexpro.so


BIN
nativeplugins/SandPayTypeModule/android/paytypesdk-uat-1.0.0.aar


BIN
nativeplugins/SandPayTypeModule/android/pro/paytypesdk-1.0.0.aar


+ 30 - 0
nativeplugins/SandPayTypeModule/package.json

@@ -0,0 +1,30 @@
+{
+	"name": "SandPayTypeModule",
+	"id": "SandPayTypeModule",
+	"version": "1.0.0",
+	"description": "全支付收银台安卓原生插件",
+	"_dp_type":"nativeplugin",
+	"_dp_nativeplugin":{
+		"android":{
+			"plugins":[
+				{
+					"type":"module",
+					"name":"SandPayTypeModule",
+					"class":"com.sand.qzf.paytypesdk.base.SandPayTypeModule"
+				}
+			],
+			"dependencies":{ 
+				
+			},
+			"useAndroidX": true,
+			"integrateType":"aar",
+			"abis": ["arm64-v8a","armeabi-v7a","x86"],
+			"minSdkVersion":"21",
+			"parameters": {
+				"jumpScheme_host": {
+					"placeholder": "SandPayTypeModule-jumpScheme_host"
+				}
+			}
+		}
+	}
+}

+ 18257 - 0
package-lock.json

@@ -0,0 +1,18257 @@
+{
+  "name": "uni-app",
+  "version": "0.1.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.14.5.tgz?cache=0&sync_timestamp=1623280355998&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.14.5.tgz",
+      "integrity": "sha1-I7CNdA6D9JxeWZRfvxtD6Au/Tts=",
+      "requires": {
+        "@babel/highlight": "^7.14.5"
+      }
+    },
+    "@babel/compat-data": {
+      "version": "7.15.0",
+      "resolved": "https://registry.nlark.com/@babel/compat-data/download/@babel/compat-data-7.15.0.tgz",
+      "integrity": "sha1-Lbr4uFM0eWyvuw9Xk6kKL8AQsXY="
+    },
+    "@babel/core": {
+      "version": "7.15.5",
+      "resolved": "https://registry.nlark.com/@babel/core/download/@babel/core-7.15.5.tgz",
+      "integrity": "sha1-+O2aznMHIlRGCfkMm7SRYtw79bk=",
+      "requires": {
+        "@babel/code-frame": "^7.14.5",
+        "@babel/generator": "^7.15.4",
+        "@babel/helper-compilation-targets": "^7.15.4",
+        "@babel/helper-module-transforms": "^7.15.4",
+        "@babel/helpers": "^7.15.4",
+        "@babel/parser": "^7.15.5",
+        "@babel/template": "^7.15.4",
+        "@babel/traverse": "^7.15.4",
+        "@babel/types": "^7.15.4",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.1.2",
+        "semver": "^6.3.0",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.2.0.tgz",
+          "integrity": "sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=",
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "@babel/generator": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/generator/download/@babel/generator-7.15.4.tgz?cache=0&sync_timestamp=1630618812112&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.15.4.tgz",
+      "integrity": "sha1-hayxWaJnymMk+Xk5hpke4gIqBbA=",
+      "requires": {
+        "@babel/types": "^7.15.4",
+        "jsesc": "^2.5.1",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "@babel/helper-annotate-as-pure": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.15.4.tgz?cache=0&sync_timestamp=1630618813039&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.15.4.tgz",
+      "integrity": "sha1-PQ5DsAxeSf22xX5CFgGnpljV+DU=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz?cache=0&sync_timestamp=1630618814111&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor%2Fdownload%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor-7.15.4.tgz",
+      "integrity": "sha1-Ia2BX2CbhO4OMFhnbDPPbRZwUl8=",
+      "requires": {
+        "@babel/helper-explode-assignable-expression": "^7.15.4",
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-compilation-targets": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.15.4.tgz?cache=0&sync_timestamp=1630618809411&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-compilation-targets%2Fdownload%2F%40babel%2Fhelper-compilation-targets-7.15.4.tgz",
+      "integrity": "sha1-z22U8w++/BORI+J91rAvZa7tt7k=",
+      "requires": {
+        "@babel/compat-data": "^7.15.0",
+        "@babel/helper-validator-option": "^7.14.5",
+        "browserslist": "^4.16.6",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
+        }
+      }
+    },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.15.4.tgz?cache=0&sync_timestamp=1630618827775&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-create-class-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-class-features-plugin-7.15.4.tgz",
+      "integrity": "sha1-f5d8F70SpfujY8sZvqCQOUvzfS4=",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.15.4",
+        "@babel/helper-function-name": "^7.15.4",
+        "@babel/helper-member-expression-to-functions": "^7.15.4",
+        "@babel/helper-optimise-call-expression": "^7.15.4",
+        "@babel/helper-replace-supers": "^7.15.4",
+        "@babel/helper-split-export-declaration": "^7.15.4"
+      }
+    },
+    "@babel/helper-create-regexp-features-plugin": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.14.5.tgz?cache=0&sync_timestamp=1623280375996&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-create-regexp-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-regexp-features-plugin-7.14.5.tgz",
+      "integrity": "sha1-x9WsXpz2IcJgV3Ivt6ikxYiTWMQ=",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.14.5",
+        "regexpu-core": "^4.7.1"
+      }
+    },
+    "@babel/helper-define-polyfill-provider": {
+      "version": "0.2.3",
+      "resolved": "https://registry.nlark.com/@babel/helper-define-polyfill-provider/download/@babel/helper-define-polyfill-provider-0.2.3.tgz?cache=0&sync_timestamp=1622025430652&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-define-polyfill-provider%2Fdownload%2F%40babel%2Fhelper-define-polyfill-provider-0.2.3.tgz",
+      "integrity": "sha1-BSXt7FCUZTooJojTTYRuTHXpwLY=",
+      "requires": {
+        "@babel/helper-compilation-targets": "^7.13.0",
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/traverse": "^7.13.0",
+        "debug": "^4.1.1",
+        "lodash.debounce": "^4.0.8",
+        "resolve": "^1.14.2",
+        "semver": "^6.1.2"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
+        }
+      }
+    },
+    "@babel/helper-explode-assignable-expression": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.15.4.tgz?cache=0&sync_timestamp=1630618813272&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-explode-assignable-expression%2Fdownload%2F%40babel%2Fhelper-explode-assignable-expression-7.15.4.tgz",
+      "integrity": "sha1-+a7J0hnycer5K59WFZjKayaCYAw=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-function-name/download/@babel/helper-function-name-7.15.4.tgz?cache=0&sync_timestamp=1630618814391&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-function-name%2Fdownload%2F%40babel%2Fhelper-function-name-7.15.4.tgz",
+      "integrity": "sha1-hFdE2vxDgaSl+2r6bD02+Yp4frw=",
+      "requires": {
+        "@babel/helper-get-function-arity": "^7.15.4",
+        "@babel/template": "^7.15.4",
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-get-function-arity": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.15.4.tgz?cache=0&sync_timestamp=1630618811593&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.15.4.tgz",
+      "integrity": "sha1-CYgYk0oTf854tTaj4BWGS+Hih5s=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.15.4.tgz?cache=0&sync_timestamp=1630618812572&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-hoist-variables%2Fdownload%2F%40babel%2Fhelper-hoist-variables-7.15.4.tgz",
+      "integrity": "sha1-CZk6MlnA6Rj5nRBCYd/fwDPxeN8=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.15.4.tgz?cache=0&sync_timestamp=1630618813495&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-member-expression-to-functions%2Fdownload%2F%40babel%2Fhelper-member-expression-to-functions-7.15.4.tgz",
+      "integrity": "sha1-v9NNybupgkpGWLAxfsL9VxpR5u8=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.15.4.tgz?cache=0&sync_timestamp=1630618812291&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.15.4.tgz",
+      "integrity": "sha1-4YAH0jBjLeoZtHhTuYRHbntOED8=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.15.4.tgz?cache=0&sync_timestamp=1630618812266&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-module-transforms%2Fdownload%2F%40babel%2Fhelper-module-transforms-7.15.4.tgz",
+      "integrity": "sha1-lizGKaf3+aCC3WLQMH+nX+h4jXw=",
+      "requires": {
+        "@babel/helper-module-imports": "^7.15.4",
+        "@babel/helper-replace-supers": "^7.15.4",
+        "@babel/helper-simple-access": "^7.15.4",
+        "@babel/helper-split-export-declaration": "^7.15.4",
+        "@babel/helper-validator-identifier": "^7.14.9",
+        "@babel/template": "^7.15.4",
+        "@babel/traverse": "^7.15.4",
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.15.4.tgz?cache=0&sync_timestamp=1630618812766&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-optimise-call-expression%2Fdownload%2F%40babel%2Fhelper-optimise-call-expression-7.15.4.tgz",
+      "integrity": "sha1-8xClEho7nMUtmrGRIr1ymCLe4XE=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.14.5.tgz",
+      "integrity": "sha1-WsgizpfuxGdBq3ClF5ceRDpwxak="
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.15.4.tgz?cache=0&sync_timestamp=1630618818480&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-remap-async-to-generator%2Fdownload%2F%40babel%2Fhelper-remap-async-to-generator-7.15.4.tgz",
+      "integrity": "sha1-JjfAcx5MkPv1isWLULK1oZL8lw8=",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.15.4",
+        "@babel/helper-wrap-function": "^7.15.4",
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.15.4.tgz?cache=0&sync_timestamp=1630618814840&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-replace-supers%2Fdownload%2F%40babel%2Fhelper-replace-supers-7.15.4.tgz",
+      "integrity": "sha1-UqirJrqRjH9t7ihiiwcHGse3NHo=",
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.15.4",
+        "@babel/helper-optimise-call-expression": "^7.15.4",
+        "@babel/traverse": "^7.15.4",
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.15.4.tgz?cache=0&sync_timestamp=1630618813217&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.15.4.tgz",
+      "integrity": "sha1-rDaJBavx3o6XgUNLY12PhnS8wTs=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.15.4.tgz?cache=0&sync_timestamp=1630618813661&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-skip-transparent-expression-wrappers%2Fdownload%2F%40babel%2Fhelper-skip-transparent-expression-wrappers-7.15.4.tgz",
+      "integrity": "sha1-cH29uh9K0Po0+RFPyBl67H1dous=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.15.4.tgz?cache=0&sync_timestamp=1630618813944&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.15.4.tgz",
+      "integrity": "sha1-rsq5Lc2+9qEKo7YqsgSwhfd24lc=",
+      "requires": {
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helper-string-parser": {
+      "version": "7.24.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz",
+      "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==",
+      "dev": true
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.14.9",
+      "resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.14.9.tgz?cache=0&sync_timestamp=1627804495811&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.14.9.tgz",
+      "integrity": "sha1-ZlTRcbICT22O4VG/JQlpmRkTHUg="
+    },
+    "@babel/helper-validator-option": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.14.5.tgz",
+      "integrity": "sha1-bnKh//GNXfy4eOHmLxoCHEty1aM="
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.15.4.tgz?cache=0&sync_timestamp=1630618815324&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-wrap-function%2Fdownload%2F%40babel%2Fhelper-wrap-function-7.15.4.tgz",
+      "integrity": "sha1-b3VLJEbPrz1hJSPmq415wnw6Pec=",
+      "requires": {
+        "@babel/helper-function-name": "^7.15.4",
+        "@babel/template": "^7.15.4",
+        "@babel/traverse": "^7.15.4",
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/helpers/download/@babel/helpers-7.15.4.tgz?cache=0&sync_timestamp=1630618815077&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelpers%2Fdownload%2F%40babel%2Fhelpers-7.15.4.tgz",
+      "integrity": "sha1-X0DwIFCjAnEho89I1JfAXFVer0M=",
+      "requires": {
+        "@babel/template": "^7.15.4",
+        "@babel/traverse": "^7.15.4",
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/highlight/download/@babel/highlight-7.14.5.tgz",
+      "integrity": "sha1-aGGlLwOWZAUAH2qlNKAaJNmejNk=",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.14.5",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.15.5",
+      "resolved": "https://registry.nlark.com/@babel/parser/download/@babel/parser-7.15.5.tgz",
+      "integrity": "sha1-0zpYymn6zAWyat/kq+v+1WwcLaw="
+    },
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/download/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz?cache=0&sync_timestamp=1630618814180&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-bugfix-v8-spread-parameters-in-optional-chaining%2Fdownload%2F%40babel%2Fplugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz",
+      "integrity": "sha1-296rsegPYi2fC1g++ymZYF4KVn4=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4",
+        "@babel/plugin-proposal-optional-chaining": "^7.14.5"
+      }
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.15.4.tgz?cache=0&sync_timestamp=1630618820334&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-async-generator-functions%2Fdownload%2F%40babel%2Fplugin-proposal-async-generator-functions-7.15.4.tgz",
+      "integrity": "sha1-+Cqr6WwTXSzqqRf+ufX8oxY1J34=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-remap-async-to-generator": "^7.15.4",
+        "@babel/plugin-syntax-async-generators": "^7.8.4"
+      }
+    },
+    "@babel/plugin-proposal-class-properties": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.14.5.tgz?cache=0&sync_timestamp=1623280991885&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-class-properties%2Fdownload%2F%40babel%2Fplugin-proposal-class-properties-7.14.5.tgz",
+      "integrity": "sha1-QNHuFAxbHjGjUPT17tlFCWVZtC4=",
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-proposal-class-static-block": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-class-static-block/download/@babel/plugin-proposal-class-static-block-7.15.4.tgz?cache=0&sync_timestamp=1630618819444&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-class-static-block%2Fdownload%2F%40babel%2Fplugin-proposal-class-static-block-7.15.4.tgz",
+      "integrity": "sha1-PnymEoRTwInotHepn5cMY/wcuNc=",
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.15.4",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5"
+      }
+    },
+    "@babel/plugin-proposal-decorators": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.15.4.tgz?cache=0&sync_timestamp=1630618871699&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-decorators%2Fdownload%2F%40babel%2Fplugin-proposal-decorators-7.15.4.tgz",
+      "integrity": "sha1-+1VEK8g6tNRd2na5GUlwa/IogdI=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.15.4",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-decorators": "^7.14.5"
+      }
+    },
+    "@babel/plugin-proposal-dynamic-import": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.14.5.tgz",
+      "integrity": "sha1-DGYX30YcDB+P/ztHzVl3I2AQHSw=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-export-namespace-from": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.14.5.tgz",
+      "integrity": "sha1-260kQxDObM0IMHIWfYzqg6Uvr3Y=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-json-strings": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.14.5.tgz",
+      "integrity": "sha1-ON5g2zYug6PYyUSshY3fnwwiOes=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-json-strings": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-logical-assignment-operators": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.14.5.tgz",
+      "integrity": "sha1-bmIpwqmbAqspFfglceDMZGpAxzg=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz",
+      "integrity": "sha1-7jhYnOAOLMWbKZ7D6kBvzToP2vY=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-numeric-separator": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.14.5.tgz",
+      "integrity": "sha1-g2Mb8z2aUd8YTCECoGmsDFjAXxg=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.14.7",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.14.7.tgz",
+      "integrity": "sha1-WSCis99/eQHfAgWXTAZBsT/Z02M=",
+      "requires": {
+        "@babel/compat-data": "^7.14.7",
+        "@babel/helper-compilation-targets": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.14.5"
+      }
+    },
+    "@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.14.5.tgz",
+      "integrity": "sha1-k53W7d7/Omf997PwRLU0cmJZjDw=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-optional-chaining": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.14.5.tgz?cache=0&sync_timestamp=1623280381280&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-optional-chaining%2Fdownload%2F%40babel%2Fplugin-proposal-optional-chaining-7.14.5.tgz",
+      "integrity": "sha1-+oNlHmCjYOPxN5fu8AuNUZaVtgM=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-private-methods": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.14.5.tgz?cache=0&sync_timestamp=1623281841960&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-private-methods%2Fdownload%2F%40babel%2Fplugin-proposal-private-methods-7.14.5.tgz",
+      "integrity": "sha1-N0RklZlrKUXzD1vltg1eKqT1eS0=",
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-proposal-private-property-in-object": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-private-property-in-object/download/@babel/plugin-proposal-private-property-in-object-7.15.4.tgz?cache=0&sync_timestamp=1630618820812&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-proposal-private-property-in-object%2Fdownload%2F%40babel%2Fplugin-proposal-private-property-in-object-7.15.4.tgz",
+      "integrity": "sha1-VcXjtNAmH9RP5jfj9iTPsPSE4+U=",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.15.4",
+        "@babel/helper-create-class-features-plugin": "^7.15.4",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+      }
+    },
+    "@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.14.5.tgz",
+      "integrity": "sha1-D5XuDnV6XWR/N42qDsp+k/qou+g=",
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-bigint": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.13.tgz?cache=0&sync_timestamp=1612314829085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-class-properties%2Fdownload%2F%40babel%2Fplugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-syntax-class-static-block": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-syntax-class-static-block/download/@babel/plugin-syntax-class-static-block-7.14.5.tgz",
+      "integrity": "sha1-GV34mxRrS3izv4l/16JXyEZZ1AY=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-syntax-decorators": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.14.5.tgz",
+      "integrity": "sha1-6vucDL4JyK/rlkujp7vWOUWnLyA=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha1-AolkqbqA28CUyRXEh618TnpmRlo=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      }
+    },
+    "@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-jsx": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.14.5.tgz",
+      "integrity": "sha1-AA4uJdhnPM5JMAUXo+2kTCY+QgE=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-private-property-in-object": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-syntax-private-property-in-object/download/@babel/plugin-syntax-private-property-in-object-7.14.5.tgz",
+      "integrity": "sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-syntax-top-level-await": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.14.5.tgz",
+      "integrity": "sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-syntax-typescript": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-syntax-typescript/download/@babel/plugin-syntax-typescript-7.14.5.tgz",
+      "integrity": "sha1-uCxs5HGxZbXOQgz5KRTW+0YiVxY=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-arrow-functions": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.14.5.tgz",
+      "integrity": "sha1-9xh9lYinaN0IC/TJ/+EX6mL3hio=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-async-to-generator": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.14.5.tgz?cache=0&sync_timestamp=1623280991702&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-async-to-generator%2Fdownload%2F%40babel%2Fplugin-transform-async-to-generator-7.14.5.tgz",
+      "integrity": "sha1-cseJCE2PIJSsuUVjOUPvhEPTnmc=",
+      "requires": {
+        "@babel/helper-module-imports": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-remap-async-to-generator": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.14.5.tgz",
+      "integrity": "sha1-5IZB2ZnUvBV6Z+8zautUvET9OtQ=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-block-scoping": {
+      "version": "7.15.3",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.15.3.tgz",
+      "integrity": "sha1-lMgabi/CMLzObvU3rJah5NKzr68=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.15.4.tgz?cache=0&sync_timestamp=1630618822856&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-classes%2Fdownload%2F%40babel%2Fplugin-transform-classes-7.15.4.tgz",
+      "integrity": "sha1-UK7heq9/MyrkTjvOTC4QU01dO/E=",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.15.4",
+        "@babel/helper-function-name": "^7.15.4",
+        "@babel/helper-optimise-call-expression": "^7.15.4",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-replace-supers": "^7.15.4",
+        "@babel/helper-split-export-declaration": "^7.15.4",
+        "globals": "^11.1.0"
+      }
+    },
+    "@babel/plugin-transform-computed-properties": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.14.5.tgz",
+      "integrity": "sha1-G514mHQg0RIj1BGVRhzEO5dLIE8=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-destructuring": {
+      "version": "7.14.7",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.14.7.tgz",
+      "integrity": "sha1-CtWO034j4iCE0QnxhSYINeVVdXY=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.14.5.tgz",
+      "integrity": "sha1-L2v3bka9+AQ7Tn4WzyRTJim6DHo=",
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.14.5.tgz",
+      "integrity": "sha1-NlpIRIgb3xUB46nwJw5/D5EXeVQ=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.14.5.tgz?cache=0&sync_timestamp=1623280991210&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-exponentiation-operator%2Fdownload%2F%40babel%2Fplugin-transform-exponentiation-operator-7.14.5.tgz",
+      "integrity": "sha1-UVS43Wo9/m2Qkj1hckvT3uuQtJM=",
+      "requires": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-for-of": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.15.4.tgz",
+      "integrity": "sha1-JcYszicYz7KXFfQW511SY/s2qMI=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.14.5.tgz?cache=0&sync_timestamp=1623280995218&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-function-name%2Fdownload%2F%40babel%2Fplugin-transform-function-name-7.14.5.tgz",
+      "integrity": "sha1-6Bxl7LkAdG1/MYAva+0fUtkV1vI=",
+      "requires": {
+        "@babel/helper-function-name": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-literals": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.14.5.tgz",
+      "integrity": "sha1-QdBsf/XU0J489Fh70+zzkwxzD3g=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-member-expression-literals": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.14.5.tgz",
+      "integrity": "sha1-s5zVISor8jWmF9Mg7CtIvMCRuKc=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.14.5.tgz?cache=0&sync_timestamp=1623280992176&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-modules-amd%2Fdownload%2F%40babel%2Fplugin-transform-modules-amd-7.14.5.tgz",
+      "integrity": "sha1-T9nOfjQRy4uDhISAtwQdgwBIWPc=",
+      "requires": {
+        "@babel/helper-module-transforms": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.15.4.tgz?cache=0&sync_timestamp=1630618823916&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.15.4.tgz",
+      "integrity": "sha1-ggEQEkDqu1p2wI72GylU92e2tME=",
+      "requires": {
+        "@babel/helper-module-transforms": "^7.15.4",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-simple-access": "^7.15.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.15.4.tgz?cache=0&sync_timestamp=1630618823971&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-modules-systemjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-systemjs-7.15.4.tgz",
+      "integrity": "sha1-tCiQxzSaeMgncZ8dLQzTjH0mgTI=",
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.15.4",
+        "@babel/helper-module-transforms": "^7.15.4",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-validator-identifier": "^7.14.9",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-umd": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.14.5.tgz?cache=0&sync_timestamp=1623280991598&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-modules-umd%2Fdownload%2F%40babel%2Fplugin-transform-modules-umd-7.14.5.tgz",
+      "integrity": "sha1-+2Yt/uaXzOJ0p82lJRkKeQlqpuA=",
+      "requires": {
+        "@babel/helper-module-transforms": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.14.9",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.14.9.tgz",
+      "integrity": "sha1-xo9cXRLS66ujdi5XwsT2NHpG57I=",
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.14.5.tgz",
+      "integrity": "sha1-Mb2ui5JdyEB26/zSqZQBQ67X2/g=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.14.5.tgz",
+      "integrity": "sha1-0LX66snphZehYanPeMUn7ZNM3EU=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-replace-supers": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.15.4.tgz?cache=0&sync_timestamp=1630618810842&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-parameters%2Fdownload%2F%40babel%2Fplugin-transform-parameters-7.15.4.tgz",
+      "integrity": "sha1-XyKFzDFgv0jIUCQycWtIUE0p7WI=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-property-literals": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.14.5.tgz",
+      "integrity": "sha1-DduqH4PbNgbxzfSEb6HftHNFizQ=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.14.5.tgz",
+      "integrity": "sha1-lnb9VwftKPUicnxbPAqoVERAsE8=",
+      "requires": {
+        "regenerator-transform": "^0.14.2"
+      }
+    },
+    "@babel/plugin-transform-reserved-words": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.14.5.tgz",
+      "integrity": "sha1-xEWJtmHP2++NQwDcx0ad/6kvgwQ=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-runtime": {
+      "version": "7.15.0",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.15.0.tgz?cache=0&sync_timestamp=1628117564879&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-runtime%2Fdownload%2F%40babel%2Fplugin-transform-runtime-7.15.0.tgz",
+      "integrity": "sha1-06plDRFnjKds4pQHH9pT14BBg7M=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "babel-plugin-polyfill-corejs2": "^0.2.2",
+        "babel-plugin-polyfill-corejs3": "^0.2.2",
+        "babel-plugin-polyfill-regenerator": "^0.2.2",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/plugin-transform-shorthand-properties": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.14.5.tgz",
+      "integrity": "sha1-l/E4VfFAkzjYyty6ymcK154JGlg=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-spread": {
+      "version": "7.14.6",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.14.6.tgz?cache=0&sync_timestamp=1623708900905&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-spread%2Fdownload%2F%40babel%2Fplugin-transform-spread-7.14.6.tgz",
+      "integrity": "sha1-a9QOV/596UqpBIUZY7VhZlL3MUQ=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-sticky-regex": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.14.5.tgz",
+      "integrity": "sha1-W2F1Qmdei3dhKUOB88KMYz9Arrk=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-template-literals": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.14.5.tgz",
+      "integrity": "sha1-pfK8Izk32EU4hdxza92Nn/q/PZM=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-typeof-symbol": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.14.5.tgz",
+      "integrity": "sha1-Oa8nOemJor0pG/a1PxaYFCPUV9Q=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-unicode-escapes": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.14.5.tgz",
+      "integrity": "sha1-nUvSpoHjxdes9PV/qeURddkdDGs=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/plugin-transform-unicode-regex": {
+      "version": "7.14.5",
+      "resolved": "https://registry.nlark.com/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.14.5.tgz?cache=0&sync_timestamp=1623280996214&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-transform-unicode-regex%2Fdownload%2F%40babel%2Fplugin-transform-unicode-regex-7.14.5.tgz",
+      "integrity": "sha1-TNCbbIQl3YElXHzrP7GDbnQUOC4=",
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.14.5"
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/preset-env/download/@babel/preset-env-7.15.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fpreset-env%2Fdownload%2F%40babel%2Fpreset-env-7.15.4.tgz",
+      "integrity": "sha1-GX5/madVxIjwr0Ea8XnL0Q3m6BU=",
+      "requires": {
+        "@babel/compat-data": "^7.15.0",
+        "@babel/helper-compilation-targets": "^7.15.4",
+        "@babel/helper-plugin-utils": "^7.14.5",
+        "@babel/helper-validator-option": "^7.14.5",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4",
+        "@babel/plugin-proposal-async-generator-functions": "^7.15.4",
+        "@babel/plugin-proposal-class-properties": "^7.14.5",
+        "@babel/plugin-proposal-class-static-block": "^7.15.4",
+        "@babel/plugin-proposal-dynamic-import": "^7.14.5",
+        "@babel/plugin-proposal-export-namespace-from": "^7.14.5",
+        "@babel/plugin-proposal-json-strings": "^7.14.5",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5",
+        "@babel/plugin-proposal-numeric-separator": "^7.14.5",
+        "@babel/plugin-proposal-object-rest-spread": "^7.14.7",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.14.5",
+        "@babel/plugin-proposal-optional-chaining": "^7.14.5",
+        "@babel/plugin-proposal-private-methods": "^7.14.5",
+        "@babel/plugin-proposal-private-property-in-object": "^7.15.4",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.14.5",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-class-properties": "^7.12.13",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+        "@babel/plugin-syntax-top-level-await": "^7.14.5",
+        "@babel/plugin-transform-arrow-functions": "^7.14.5",
+        "@babel/plugin-transform-async-to-generator": "^7.14.5",
+        "@babel/plugin-transform-block-scoped-functions": "^7.14.5",
+        "@babel/plugin-transform-block-scoping": "^7.15.3",
+        "@babel/plugin-transform-classes": "^7.15.4",
+        "@babel/plugin-transform-computed-properties": "^7.14.5",
+        "@babel/plugin-transform-destructuring": "^7.14.7",
+        "@babel/plugin-transform-dotall-regex": "^7.14.5",
+        "@babel/plugin-transform-duplicate-keys": "^7.14.5",
+        "@babel/plugin-transform-exponentiation-operator": "^7.14.5",
+        "@babel/plugin-transform-for-of": "^7.15.4",
+        "@babel/plugin-transform-function-name": "^7.14.5",
+        "@babel/plugin-transform-literals": "^7.14.5",
+        "@babel/plugin-transform-member-expression-literals": "^7.14.5",
+        "@babel/plugin-transform-modules-amd": "^7.14.5",
+        "@babel/plugin-transform-modules-commonjs": "^7.15.4",
+        "@babel/plugin-transform-modules-systemjs": "^7.15.4",
+        "@babel/plugin-transform-modules-umd": "^7.14.5",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9",
+        "@babel/plugin-transform-new-target": "^7.14.5",
+        "@babel/plugin-transform-object-super": "^7.14.5",
+        "@babel/plugin-transform-parameters": "^7.15.4",
+        "@babel/plugin-transform-property-literals": "^7.14.5",
+        "@babel/plugin-transform-regenerator": "^7.14.5",
+        "@babel/plugin-transform-reserved-words": "^7.14.5",
+        "@babel/plugin-transform-shorthand-properties": "^7.14.5",
+        "@babel/plugin-transform-spread": "^7.14.6",
+        "@babel/plugin-transform-sticky-regex": "^7.14.5",
+        "@babel/plugin-transform-template-literals": "^7.14.5",
+        "@babel/plugin-transform-typeof-symbol": "^7.14.5",
+        "@babel/plugin-transform-unicode-escapes": "^7.14.5",
+        "@babel/plugin-transform-unicode-regex": "^7.14.5",
+        "@babel/preset-modules": "^0.1.4",
+        "@babel/types": "^7.15.4",
+        "babel-plugin-polyfill-corejs2": "^0.2.2",
+        "babel-plugin-polyfill-corejs3": "^0.2.2",
+        "babel-plugin-polyfill-regenerator": "^0.2.2",
+        "core-js-compat": "^3.16.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
+        }
+      }
+    },
+    "@babel/preset-modules": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/preset-modules/download/@babel/preset-modules-0.1.4.tgz",
+      "integrity": "sha1-Ni8raMZihClw/bXiVP/I/BwuQV4=",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+        "@babel/plugin-transform-dotall-regex": "^7.4.4",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      }
+    },
+    "@babel/register": {
+      "version": "7.23.7",
+      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz",
+      "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==",
+      "requires": {
+        "clone-deep": "^4.0.1",
+        "find-cache-dir": "^2.0.0",
+        "make-dir": "^2.1.0",
+        "pirates": "^4.0.6",
+        "source-map-support": "^0.5.16"
+      }
+    },
+    "@babel/runtime": {
+      "version": "7.12.18",
+      "resolved": "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.12.18.tgz?cache=0&sync_timestamp=1630618785994&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.12.18.tgz",
+      "integrity": "sha1-rxN71+fZcFpBKzyq+ZH+aqqXgxs=",
+      "requires": {
+        "regenerator-runtime": "^0.13.4"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.13.9",
+          "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1626993001371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz",
+          "integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I="
+        }
+      }
+    },
+    "@babel/template": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/template/download/@babel/template-7.15.4.tgz?cache=0&sync_timestamp=1630618813723&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.15.4.tgz",
+      "integrity": "sha1-UYmNNdzz+qZwxO5q/P1RfuE58ZQ=",
+      "requires": {
+        "@babel/code-frame": "^7.14.5",
+        "@babel/parser": "^7.15.4",
+        "@babel/types": "^7.15.4"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/traverse/download/@babel/traverse-7.15.4.tgz?cache=0&sync_timestamp=1630618814685&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.15.4.tgz",
+      "integrity": "sha1-/4UQNnoUS/v/VS2eGOKPPiiJwi0=",
+      "requires": {
+        "@babel/code-frame": "^7.14.5",
+        "@babel/generator": "^7.15.4",
+        "@babel/helper-function-name": "^7.15.4",
+        "@babel/helper-hoist-variables": "^7.15.4",
+        "@babel/helper-split-export-declaration": "^7.15.4",
+        "@babel/parser": "^7.15.4",
+        "@babel/types": "^7.15.4",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0"
+      }
+    },
+    "@babel/types": {
+      "version": "7.15.4",
+      "resolved": "https://registry.nlark.com/@babel/types/download/@babel/types-7.15.4.tgz?cache=0&sync_timestamp=1630618811069&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.15.4.tgz",
+      "integrity": "sha1-dO64bb1nSNJ0E5ZVe5hg5X/OCg0=",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.14.9",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "@bcoe/v8-coverage": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+      "dev": true
+    },
+    "@cnakazawa/watch": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
+      "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
+      "dev": true,
+      "requires": {
+        "exec-sh": "^0.3.2",
+        "minimist": "^1.2.0"
+      }
+    },
+    "@dcloudio/types": {
+      "version": "3.4.8",
+      "resolved": "https://registry.npmjs.org/@dcloudio/types/-/types-3.4.8.tgz",
+      "integrity": "sha512-IPXuoghLv7qNPOnRuP7vC5++MdRHhE0U7EMw9ia//uOh69fFXZiRTfoHd51+nzciD6R50gqYhbrCCZIxnxhM9Q==",
+      "dev": true
+    },
+    "@dcloudio/uni-app": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-app/-/uni-app-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-kZKFwurhyJORZeUu843EnHeBhZfs/H6ZKGkBlH6WLaLw3SIKHqyopeyrFefmizWsxRUoE2aSUH7LszKZzoX78w=="
+    },
+    "@dcloudio/uni-app-plus": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-plus/-/uni-app-plus-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-daU7d3bHJTNeq5nsrCilLK1d//Un2LvZksJDtx4LcA1aGM1aBnzLTD60K+fFM6ybHf7NFFzl7X7FG323AMEMxA=="
+    },
+    "@dcloudio/uni-automator": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-automator/-/uni-automator-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-ecYq6Gjdoi4b75nnLU12VqiTWZssLhLH243wOTLn7nuaJ0EobHiQ491CFqdyfoMwZkD8mOMCUP3hiPgjnwWleQ==",
+      "dev": true,
+      "requires": {
+        "address": "^1.1.2",
+        "debug": "^4.1.1",
+        "default-gateway": "^6.0.0",
+        "jimp": "^0.10.1",
+        "jsonc-parser": "^3.2.0",
+        "kill-port": "^1.6.0",
+        "licia": "^1.21.0",
+        "postcss-selector-parser": "^6.0.2",
+        "qrcode-reader": "^1.0.4",
+        "qrcode-terminal": "^0.12.0",
+        "ws": "^7.2.3"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "default-gateway": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+          "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+          "dev": true,
+          "requires": {
+            "execa": "^5.0.0"
+          }
+        },
+        "execa": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+          "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.3",
+            "get-stream": "^6.0.0",
+            "human-signals": "^2.1.0",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.1",
+            "onetime": "^5.1.2",
+            "signal-exit": "^3.0.3",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+          "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+          "dev": true
+        },
+        "human-signals": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+          "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+          "dev": true
+        },
+        "is-stream": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        },
+        "ws": {
+          "version": "7.5.9",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+          "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+          "dev": true
+        }
+      }
+    },
+    "@dcloudio/uni-cli-i18n": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-cli-i18n/-/uni-cli-i18n-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-t2t1OIjHVKrGxYz7jMbPwo9v8MummucPe4q5mrm8UyQ3BefyFnq6Uv0Wvw265p1+LS5a8gPUpSyuhj/pVZ82Ug==",
+      "dev": true,
+      "requires": {
+        "i18n": "^0.13.3",
+        "os-locale-s-fix": "^1.0.8-fix-1"
+      }
+    },
+    "@dcloudio/uni-cli-shared": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-cli-shared/-/uni-cli-shared-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-kHRRoI9Tvi88UbtpoZzUKfHypevAlD4WsiTgmsN2QB3lf0jLgDXCOoPY+OSA+rMsnODkx4dr4NNDePxiLhbpOw==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^4.0.0",
+        "fast-glob": "^3.2.11",
+        "glob-escape": "^0.0.2",
+        "hash-sum": "^1.0.2",
+        "postcss-urlrewrite": "^0.2.2",
+        "strip-json-comments": "^2.0.1"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+          "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+          "dev": true
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "escape-string-regexp": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+          "dev": true
+        },
+        "fast-glob": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+          "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+          "dev": true,
+          "requires": {
+            "@nodelib/fs.stat": "^2.0.2",
+            "@nodelib/fs.walk": "^1.2.3",
+            "glob-parent": "^5.1.2",
+            "merge2": "^1.3.0",
+            "micromatch": "^4.0.4"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+          "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.2",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "picomatch": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+          "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+          "dev": true
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "@dcloudio/uni-h5": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5/-/uni-h5-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-XFmWpUwYg3FNkTqQHFW+dBAmFxlb0n7hQSq3n5eiASbMy+vxar4jdj2lVrksRJ7xEapNMznqDv+1Imk53WRudw==",
+      "requires": {
+        "base64-arraybuffer": "^0.2.0",
+        "intersection-observer": "^0.7.0",
+        "pako": "^1.0.11",
+        "safe-area-insets": "^1.4.1"
+      }
+    },
+    "@dcloudio/uni-helper-json": {
+      "version": "1.0.13",
+      "resolved": "https://registry.nlark.com/@dcloudio/uni-helper-json/download/@dcloudio/uni-helper-json-1.0.13.tgz",
+      "integrity": "sha1-ToqgYtqu+zDZiXPANaewq2KDKcc="
+    },
+    "@dcloudio/uni-i18n": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-i18n/-/uni-i18n-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-/hWgBivvm2qiVezZbrLtA/NiHvxQmGb061/XVWUKYB8FvqriZbF7L1mNyWH780Ril0yvJqGcjW/i2DXCCozBMA=="
+    },
+    "@dcloudio/uni-migration": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-migration/-/uni-migration-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-/Fs6mWtdNlc8+ejfRQyWebrA745pjg8DNTjl6yVZXdhT4q6A54ROP9n6qbt8wHNcGnZPrxofvklIzH5e9OQFVA==",
+      "dev": true,
+      "requires": {
+        "commander": "^4.0.1",
+        "fs-extra": "^8.1.0",
+        "mustache": "^3.1.0",
+        "recast": "*",
+        "stricter-htmlparser2": "^3.9.6"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+          "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+          "dev": true
+        },
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "mustache": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.2.1.tgz",
+          "integrity": "sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA==",
+          "dev": true
+        }
+      }
+    },
+    "@dcloudio/uni-mp-360": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-360/-/uni-mp-360-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-+OHIiCBpI1pN5r/Dein6VxSm6TyO1KxRP9NMhBKBrHhXgHZT81RdbJVu4DK9Ntac9Rcj+Pq2/J9qsz8cOtKLow=="
+    },
+    "@dcloudio/uni-mp-alipay": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-alipay/-/uni-mp-alipay-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-AiWfSPogsz4WYpyX7+9SkqEAzHPHodEjliZ+qtp7GmdGMKtCn2fGfKDzLDPIQZaWSdI6RRl/ivY7AX4mQzoZNw=="
+    },
+    "@dcloudio/uni-mp-baidu": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-baidu/-/uni-mp-baidu-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-JsTBp19A41L0eHe2azO4IoqNtUnVicuPnfmFFx9AdaLQrHGoybXB5oRfOjsRpidtrnEilzjNIb5c0nn7gnZUAg=="
+    },
+    "@dcloudio/uni-mp-jd": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-jd/-/uni-mp-jd-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-I0IWMCR/rM3Hvhutkt2Cqm7xEJ1j2tplDgNGFfkI6GiTKSgf9CkgNXJHA52Pgk/zBCCUobalId3EFf+JrKdcuw=="
+    },
+    "@dcloudio/uni-mp-kuaishou": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-kuaishou/-/uni-mp-kuaishou-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-64Z8wYh6yMAg2MG0aHvIIYG3Nxaj9RsgdXiKZkX/2AhWb7YkZiCItZXhF2eatTTteRWnNP52g6EcGq/1RYaJ/g=="
+    },
+    "@dcloudio/uni-mp-lark": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-lark/-/uni-mp-lark-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-6c2XDrcWFNdqY8/u5MxfnLwZ28gb39gCzPO1oXev7AmzNEj1qISyNPh/2jdh/BcgZ2BfT2wG8LS7JvWQV3/SIQ=="
+    },
+    "@dcloudio/uni-mp-qq": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-qq/-/uni-mp-qq-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-wVCX2o0cDSyR+J6ThhM8DiZ8rfMw/TvvFPuoETsa0HHAb9zaTYFkPETIrHHAZlEEky/AGQQUg/Js29oWwvN88g=="
+    },
+    "@dcloudio/uni-mp-toutiao": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-toutiao/-/uni-mp-toutiao-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-Oag/Om8VVejZFfxbM24bTwlfn8UsIUr8L6m4UommYsasG4dQxRNI6JAHv3P3/4+HN1FEU9JJc824WXTqfc3Ftg=="
+    },
+    "@dcloudio/uni-mp-vue": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-vue/-/uni-mp-vue-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-VR4X9k5iBrZocb+2jeWuL3ggwSjwkaJN9tl2qvO9R0gU+TjSHFRjN4DN3ahsQAC0VjcXW/G/ouKBIFeu7twoeQ=="
+    },
+    "@dcloudio/uni-mp-weixin": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-weixin/-/uni-mp-weixin-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-+f2DJe5c7+eSzcTttIzYJVcDxzev9CIFDP91/hm1tt7vSCQF6Xa5xGJ7RUN4MrrKQjSe6AAkhj3Aa17uVY5XQQ=="
+    },
+    "@dcloudio/uni-mp-xhs": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-xhs/-/uni-mp-xhs-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-SDWyIYS8WzJ0B1KMDY7hhWAS93tFBfAdTFTikSVzibYB/0KzxMP0VE112RPegSSTCIYFNNAm+iBCwnIMR6zNkQ=="
+    },
+    "@dcloudio/uni-quickapp-native": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-quickapp-native/-/uni-quickapp-native-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-a0Z4YgKLQ7RH/ytrmyfPi1IVCOB3eQFCrVmefjUUxbZtzJIElbZm3hrcp98b1xEO4gvMD9EhtWYIqoQSHjPexg==",
+      "requires": {
+        "@hap-toolkit/dsl-vue": "0.6.13",
+        "@hap-toolkit/packager": "0.6.13",
+        "@hap-toolkit/server": "0.6.13",
+        "module-alias": "^2.1.0"
+      }
+    },
+    "@dcloudio/uni-quickapp-webview": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-quickapp-webview/-/uni-quickapp-webview-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-ZwC/YEMu5EUQt3WVSxgl0WfLbx/w/RFqvTkK9hZX106IuzVFdCKnIFvdyuXIYxzdyi2hISQQEXlEoq1EWWi5QA=="
+    },
+    "@dcloudio/uni-stacktracey": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-stacktracey/-/uni-stacktracey-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-Ht2kvmChf3VUAuWY+p/L/cpajdxVsVLQQqOzMIuEeSaJ1cboIu2pODNxHy55X8tnzCaZOObbZSrMUpcN/hW4nA=="
+    },
+    "@dcloudio/uni-stat": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-stat/-/uni-stat-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-cbwNIG4oDZXNIIKKfs5kNrMKcNqAofR/2wtagqkMEmABNfcKZL/BGdfZBZeKOYlkQfCq5o76/HwLK/65P4iNog=="
+    },
+    "@dcloudio/uni-template-compiler": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-template-compiler/-/uni-template-compiler-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-y9NpUWoYcRPTrtUtKamhuUb+g3JURnOKaZRaTSz+vE2hKp9bHcn4jSH4EZ130X4MzvyoJgCzHYQs8l9NKiXnjg==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.3.3",
+        "@babel/template": "^7.3.3",
+        "@babel/traverse": "^7.3.3",
+        "@babel/types": "^7.3.3",
+        "vue-template-compiler": "^2.6.10"
+      }
+    },
+    "@dcloudio/vue-cli-plugin-hbuilderx": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/vue-cli-plugin-hbuilderx/-/vue-cli-plugin-hbuilderx-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-Pca7pdzHTB0jcBjAX9AqW3R3NUtWh1SG9uO3TnlDaZLF9J3NrtcERpNWxUP0LYhfchMccuvBZ6Jt6gG9P6rYiA==",
+      "dev": true,
+      "requires": {
+        "acorn": "^5.2.1",
+        "css": "~2.2.1",
+        "escodegen": "^1.8.1"
+      }
+    },
+    "@dcloudio/vue-cli-plugin-uni": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/vue-cli-plugin-uni/-/vue-cli-plugin-uni-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-CRgI/6a0p5JNFlnj1JoYF+GQIhtI2wAEBc36N+17DM4YKkkzJsZ2y2WcZx/EsvqhGcX/e5qca8nUB/xjTGZqXg==",
+      "dev": true,
+      "requires": {
+        "@dcloudio/uni-stat": "^2.0.2-4010520240507001",
+        "buffer-json": "^2.0.0",
+        "clone-deep": "^4.0.1",
+        "cross-env": "^5.2.0",
+        "envinfo": "^6.0.1",
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.1.0",
+        "lru-cache": "^4.1.2",
+        "mkdirp": "^0.5.1",
+        "module-alias": "^2.1.0",
+        "neo-async": "^2.6.1",
+        "postcss-import": "^12.0.1",
+        "postcss-selector-parser": "^5.0.0",
+        "postcss-value-parser": "^3.3.1",
+        "strip-json-comments": "^2.0.1",
+        "update-check": "^1.5.3",
+        "webpack-merge": "^4.1.4",
+        "wrap-loader": "^0.2.0",
+        "xregexp": "4.0.0"
+      },
+      "dependencies": {
+        "cross-env": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz",
+          "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.5"
+          }
+        },
+        "cssesc": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+          "dev": true
+        },
+        "postcss-selector-parser": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+          "dev": true,
+          "requires": {
+            "cssesc": "^2.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "@dcloudio/vue-cli-plugin-uni-optimize": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/vue-cli-plugin-uni-optimize/-/vue-cli-plugin-uni-optimize-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-OoYw1FOmbez+8M3DNufk75ouVLewam9Rk+dbW76nQDBl+Ae0yRzx7eqz/n2Fc6yVI2bC3flAADnrNxvtX74Z+Q==",
+      "dev": true
+    },
+    "@dcloudio/webpack-uni-mp-loader": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/webpack-uni-mp-loader/-/webpack-uni-mp-loader-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-eujT4hdyO36lP+GkdVlkM1TgcEDJIkfr7CdtcjKc2bcQ90xw3BYP6dkhS6fVIf72EIaQd0Breci/PbuusS8vGg==",
+      "dev": true
+    },
+    "@dcloudio/webpack-uni-pages-loader": {
+      "version": "2.0.2-4010520240507001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/webpack-uni-pages-loader/-/webpack-uni-pages-loader-2.0.2-4010520240507001.tgz",
+      "integrity": "sha512-mfoG44T81UPOXNgQSkWRLAATFwZliYwT4IOXXxH/7ekeu4hko6/ZbYfrHttUj9JkCKk9emu6nKUUFVJlpeSClw==",
+      "dev": true,
+      "requires": {
+        "merge": "^2.1.1",
+        "strip-json-comments": "^2.0.1"
+      }
+    },
+    "@hap-toolkit/compiler": {
+      "version": "0.6.15",
+      "resolved": "https://registry.npmjs.org/@hap-toolkit/compiler/-/compiler-0.6.15.tgz",
+      "integrity": "sha512-ivGKaBhC5NoNrb9qXhzrqPyWVG1YDEUxkTeveL2oqve4WLlK7h7fJfGjMx/jSvGvLGyhquofF5mxkQzLdCCieg==",
+      "requires": {
+        "@babel/core": "^7.3.4",
+        "@babel/plugin-transform-template-literals": "^7.2.0",
+        "@hap-toolkit/shared-utils": "0.6.15",
+        "css": "^2.2.4",
+        "css-what": "^2.1.3",
+        "escodegen": "^1.11.1",
+        "esprima": "^4.0.1",
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.2.3",
+        "parse5": "^3.0.3",
+        "source-map": "^0.7.3",
+        "webpack": "^4.29.5"
+      },
+      "dependencies": {
+        "css-what": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+          "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg=="
+        },
+        "parse5": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
+          "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
+          "requires": {
+            "@types/node": "*"
+          }
+        },
+        "source-map": {
+          "version": "0.7.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+          "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="
+        }
+      }
+    },
+    "@hap-toolkit/debugger": {
+      "version": "0.6.15",
+      "resolved": "https://registry.npmjs.org/@hap-toolkit/debugger/-/debugger-0.6.15.tgz",
+      "integrity": "sha512-AO2ZHJiqS9gP3Xi/6S63Sl2Tgf81NEhNVjY81RHIhraoEPuTsPPUsUQoYEvU6tO9Y69OXCVT4C1O+kY/LrwY+g==",
+      "requires": {
+        "@hap-toolkit/shared-utils": "0.6.15",
+        "adb-commander": "^0.1.8",
+        "adb-devices-emitter": "^0.1.8",
+        "chrome-simple-launcher": "0.1.3",
+        "koa": "^2.7.0",
+        "koa-body": "^4.0.8",
+        "koa-router": "^7.4.0",
+        "koa-static": "^5.0.0",
+        "qr-image": "^3.2.0",
+        "socket.io": "^2.2.0"
+      }
+    },
+    "@hap-toolkit/dsl-vue": {
+      "version": "0.6.13",
+      "resolved": "https://registry.npmjs.org/@hap-toolkit/dsl-vue/-/dsl-vue-0.6.13.tgz",
+      "integrity": "sha512-mIupVZ6gseenCAY+BFLNGttFPcmuy3pGgB5dUUPBxnCvXcZhgAWQenAI/Y3/tz0ubObVjWLfbZKXDGfpLPTd9g==",
+      "requires": {
+        "@hap-toolkit/compiler": "^0.6.13",
+        "@hap-toolkit/packager": "^0.6.13",
+        "@hap-toolkit/shared-utils": "^0.6.13",
+        "css-loader": "^2.1.1",
+        "md5": "^2.2.1",
+        "mini-css-extract-plugin": "^0.5.0",
+        "url-loader": "^2.1.0",
+        "vue-loader": "^15.6.4",
+        "vue-template-compiler": "^2.6.7",
+        "webpack-sources": "^1.3.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        },
+        "css-loader": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz",
+          "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==",
+          "requires": {
+            "camelcase": "^5.2.0",
+            "icss-utils": "^4.1.0",
+            "loader-utils": "^1.2.3",
+            "normalize-path": "^3.0.0",
+            "postcss": "^7.0.14",
+            "postcss-modules-extract-imports": "^2.0.0",
+            "postcss-modules-local-by-default": "^2.0.6",
+            "postcss-modules-scope": "^2.1.0",
+            "postcss-modules-values": "^2.0.0",
+            "postcss-value-parser": "^3.3.0",
+            "schema-utils": "^1.0.0"
+          }
+        },
+        "mini-css-extract-plugin": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz",
+          "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==",
+          "requires": {
+            "loader-utils": "^1.1.0",
+            "schema-utils": "^1.0.0",
+            "webpack-sources": "^1.1.0"
+          }
+        },
+        "postcss-modules-local-by-default": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz",
+          "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==",
+          "requires": {
+            "postcss": "^7.0.6",
+            "postcss-selector-parser": "^6.0.0",
+            "postcss-value-parser": "^3.3.1"
+          }
+        },
+        "postcss-modules-values": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz",
+          "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==",
+          "requires": {
+            "icss-replace-symbols": "^1.1.0",
+            "postcss": "^7.0.6"
+          }
+        }
+      }
+    },
+    "@hap-toolkit/packager": {
+      "version": "0.6.13",
+      "resolved": "https://registry.npmjs.org/@hap-toolkit/packager/-/packager-0.6.13.tgz",
+      "integrity": "sha512-x0PoC+6rxAcRjryuNbW5o7LBjRxTFUkgbWl2ovOTjrKaChw51JjSqcLR28klk4SiiPLUPpAJxMjz/ooc35yZ3Q==",
+      "requires": {
+        "@babel/core": "^7.3.3",
+        "@babel/preset-env": "^7.3.1",
+        "@babel/register": "^7.0.0",
+        "@babel/runtime": "^7.3.1",
+        "@hap-toolkit/compiler": "^0.6.13",
+        "@hap-toolkit/shared-utils": "^0.6.13",
+        "aaptjs": "^1.3.1",
+        "babel-loader": "^8.0.5",
+        "fs-extra": "^7.0.1",
+        "hash-sum": "^1.0.2",
+        "jsrsasign": "^7.2.2",
+        "jszip": "^3.1.5",
+        "koa-bodyparser": "^4.2.1",
+        "koa-router": "^7.4.0",
+        "loader-utils": "^1.2.3",
+        "moment": "^2.24.0",
+        "qr-image": "^3.2.0",
+        "webpack": "^4.29.5"
+      }
+    },
+    "@hap-toolkit/server": {
+      "version": "0.6.13",
+      "resolved": "https://registry.npmjs.org/@hap-toolkit/server/-/server-0.6.13.tgz",
+      "integrity": "sha512-d29Ivum+MvPL0AEnjHW+jNa8FUqnmCPvwHii8la8OGg9HzTj7Oq7pr9n+VjksbfNI0aWdlf+uzyZEuh9rUxJ7g==",
+      "requires": {
+        "@babel/runtime": "^7.3.1",
+        "@hap-toolkit/debugger": "^0.6.13",
+        "@hap-toolkit/packager": "^0.6.13",
+        "@hap-toolkit/shared-utils": "^0.6.13",
+        "jszip": "^3.2.0",
+        "koa": "^2.7.0",
+        "koa-body": "^4.0.8",
+        "koa-mount": "^4.0.0",
+        "koa-router": "^7.4.0",
+        "koa-send": "^5.0.0",
+        "koa-static": "^5.0.0",
+        "opn": "^5.4.0",
+        "portfinder": "^1.0.20",
+        "qr-image": "^3.2.0"
+      }
+    },
+    "@hap-toolkit/shared-utils": {
+      "version": "0.6.15",
+      "resolved": "https://registry.npmjs.org/@hap-toolkit/shared-utils/-/shared-utils-0.6.15.tgz",
+      "integrity": "sha512-LxjISCLd4opthpkPIQNkMnVY+P5iWG8X6PwexET8tzWYvIUVNa66NR5lOCeOYMoLaMzxQkLZf1HTw14S7zRezQ==",
+      "requires": {
+        "chalk": "^2.4.2",
+        "qrcode-terminal": "^0.12.0"
+      }
+    },
+    "@hapi/address": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz?cache=0&sync_timestamp=1603524710662&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Faddress%2Fdownload%2F%40hapi%2Faddress-2.1.4.tgz",
+      "integrity": "sha1-XWftQ/P9QaadS5/3tW58DR0KgeU=",
+      "dev": true
+    },
+    "@hapi/bourne": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npm.taobao.org/@hapi/bourne/download/@hapi/bourne-1.3.2.tgz",
+      "integrity": "sha1-CnCVreoGckPOMoPhtWuKj0U7JCo=",
+      "dev": true
+    },
+    "@hapi/hoek": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npm.taobao.org/@hapi/hoek/download/@hapi/hoek-8.5.1.tgz?cache=0&sync_timestamp=1618694423634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Fhoek%2Fdownload%2F%40hapi%2Fhoek-8.5.1.tgz",
+      "integrity": "sha1-/elgZMpEbeyMVajC8TCVewcMbgY=",
+      "dev": true
+    },
+    "@hapi/joi": {
+      "version": "15.1.1",
+      "resolved": "https://registry.npm.taobao.org/@hapi/joi/download/@hapi/joi-15.1.1.tgz",
+      "integrity": "sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc=",
+      "dev": true,
+      "requires": {
+        "@hapi/address": "2.x.x",
+        "@hapi/bourne": "1.x.x",
+        "@hapi/hoek": "8.x.x",
+        "@hapi/topo": "3.x.x"
+      }
+    },
+    "@hapi/topo": {
+      "version": "3.1.6",
+      "resolved": "https://registry.nlark.com/@hapi/topo/download/@hapi/topo-3.1.6.tgz",
+      "integrity": "sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck=",
+      "dev": true,
+      "requires": {
+        "@hapi/hoek": "^8.3.0"
+      }
+    },
+    "@icon-park/vue": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/@icon-park/vue/-/vue-1.4.1.tgz",
+      "integrity": "sha512-W2QNcxCSX+itah2oRL0xecLcinyFnqo4OqJWxklpncBuN0VDkOYNPivOZY6Nb615pYOLGdKxiv0cyYus3AZjyA==",
+      "requires": {
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "csstype": "^3.0.3"
+      }
+    },
+    "@intervolga/optimize-cssnano-plugin": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npm.taobao.org/@intervolga/optimize-cssnano-plugin/download/@intervolga/optimize-cssnano-plugin-1.0.6.tgz",
+      "integrity": "sha1-vnx4RhKLiPapsdEmGgrQbrXA/fg=",
+      "dev": true,
+      "requires": {
+        "cssnano": "^4.0.0",
+        "cssnano-preset-default": "^4.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "@istanbuljs/load-nyc-config": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "find-up": "^4.1.0",
+        "get-package-type": "^0.1.0",
+        "js-yaml": "^3.13.1",
+        "resolve-from": "^5.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        }
+      }
+    },
+    "@istanbuljs/schema": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+      "dev": true
+    },
+    "@jest/console": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz",
+      "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "chalk": "^3.0.0",
+        "jest-message-util": "^25.5.0",
+        "jest-util": "^25.5.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/core": {
+      "version": "25.5.4",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.4.tgz",
+      "integrity": "sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^25.5.0",
+        "@jest/reporters": "^25.5.1",
+        "@jest/test-result": "^25.5.0",
+        "@jest/transform": "^25.5.1",
+        "@jest/types": "^25.5.0",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^3.0.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.4",
+        "jest-changed-files": "^25.5.0",
+        "jest-config": "^25.5.4",
+        "jest-haste-map": "^25.5.1",
+        "jest-message-util": "^25.5.0",
+        "jest-regex-util": "^25.2.6",
+        "jest-resolve": "^25.5.1",
+        "jest-resolve-dependencies": "^25.5.4",
+        "jest-runner": "^25.5.4",
+        "jest-runtime": "^25.5.4",
+        "jest-snapshot": "^25.5.1",
+        "jest-util": "^25.5.0",
+        "jest-validate": "^25.5.0",
+        "jest-watcher": "^25.5.0",
+        "micromatch": "^4.0.2",
+        "p-each-series": "^2.1.0",
+        "realpath-native": "^2.0.0",
+        "rimraf": "^3.0.0",
+        "slash": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+          "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.2",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "picomatch": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+          "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "@jest/environment": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz",
+      "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==",
+      "dev": true,
+      "requires": {
+        "@jest/fake-timers": "^25.5.0",
+        "@jest/types": "^25.5.0",
+        "jest-mock": "^25.5.0"
+      }
+    },
+    "@jest/fake-timers": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz",
+      "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "jest-message-util": "^25.5.0",
+        "jest-mock": "^25.5.0",
+        "jest-util": "^25.5.0",
+        "lolex": "^5.0.0"
+      }
+    },
+    "@jest/globals": {
+      "version": "25.5.2",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz",
+      "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^25.5.0",
+        "@jest/types": "^25.5.0",
+        "expect": "^25.5.0"
+      }
+    },
+    "@jest/reporters": {
+      "version": "25.5.1",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.5.1.tgz",
+      "integrity": "sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==",
+      "dev": true,
+      "requires": {
+        "@bcoe/v8-coverage": "^0.2.3",
+        "@jest/console": "^25.5.0",
+        "@jest/test-result": "^25.5.0",
+        "@jest/transform": "^25.5.1",
+        "@jest/types": "^25.5.0",
+        "chalk": "^3.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "exit": "^0.1.2",
+        "glob": "^7.1.2",
+        "graceful-fs": "^4.2.4",
+        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-instrument": "^4.0.0",
+        "istanbul-lib-report": "^3.0.0",
+        "istanbul-lib-source-maps": "^4.0.0",
+        "istanbul-reports": "^3.0.2",
+        "jest-haste-map": "^25.5.1",
+        "jest-resolve": "^25.5.1",
+        "jest-util": "^25.5.0",
+        "jest-worker": "^25.5.0",
+        "node-notifier": "^6.0.0",
+        "slash": "^3.0.0",
+        "source-map": "^0.6.0",
+        "string-length": "^3.1.0",
+        "terminal-link": "^2.0.0",
+        "v8-to-istanbul": "^4.1.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/source-map": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz",
+      "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0",
+        "graceful-fs": "^4.2.4",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+          "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+          "dev": true
+        }
+      }
+    },
+    "@jest/test-result": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz",
+      "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^25.5.0",
+        "@jest/types": "^25.5.0",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "collect-v8-coverage": "^1.0.0"
+      }
+    },
+    "@jest/test-sequencer": {
+      "version": "25.5.4",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz",
+      "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==",
+      "dev": true,
+      "requires": {
+        "@jest/test-result": "^25.5.0",
+        "graceful-fs": "^4.2.4",
+        "jest-haste-map": "^25.5.1",
+        "jest-runner": "^25.5.4",
+        "jest-runtime": "^25.5.4"
+      }
+    },
+    "@jest/transform": {
+      "version": "25.5.1",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz",
+      "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "@jest/types": "^25.5.0",
+        "babel-plugin-istanbul": "^6.0.0",
+        "chalk": "^3.0.0",
+        "convert-source-map": "^1.4.0",
+        "fast-json-stable-stringify": "^2.0.0",
+        "graceful-fs": "^4.2.4",
+        "jest-haste-map": "^25.5.1",
+        "jest-regex-util": "^25.2.6",
+        "jest-util": "^25.5.0",
+        "micromatch": "^4.0.2",
+        "pirates": "^4.0.1",
+        "realpath-native": "^2.0.0",
+        "slash": "^3.0.0",
+        "source-map": "^0.6.1",
+        "write-file-atomic": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+          "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.2",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "picomatch": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+          "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "@jest/types": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
+      "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^1.1.1",
+        "@types/yargs": "^15.0.0",
+        "chalk": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jimp/bmp": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.10.3.tgz",
+      "integrity": "sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "bmp-js": "^0.1.0",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/core": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.10.3.tgz",
+      "integrity": "sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "any-base": "^1.1.0",
+        "buffer": "^5.2.0",
+        "core-js": "^3.4.1",
+        "exif-parser": "^0.1.12",
+        "file-type": "^9.0.0",
+        "load-bmfont": "^1.3.1",
+        "mkdirp": "^0.5.1",
+        "phin": "^2.9.1",
+        "pixelmatch": "^4.0.2",
+        "tinycolor2": "^1.4.1"
+      },
+      "dependencies": {
+        "buffer": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+          "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+          "dev": true,
+          "requires": {
+            "base64-js": "^1.3.1",
+            "ieee754": "^1.1.13"
+          }
+        }
+      }
+    },
+    "@jimp/custom": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.10.3.tgz",
+      "integrity": "sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/core": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/gif": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.10.3.tgz",
+      "integrity": "sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "omggif": "^1.0.9"
+      }
+    },
+    "@jimp/jpeg": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.10.3.tgz",
+      "integrity": "sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "jpeg-js": "^0.3.4"
+      }
+    },
+    "@jimp/plugin-blit": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.10.3.tgz",
+      "integrity": "sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-blur": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.10.3.tgz",
+      "integrity": "sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-circle": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.10.3.tgz",
+      "integrity": "sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-color": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.10.3.tgz",
+      "integrity": "sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "tinycolor2": "^1.4.1"
+      }
+    },
+    "@jimp/plugin-contain": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.10.3.tgz",
+      "integrity": "sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-cover": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.10.3.tgz",
+      "integrity": "sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-crop": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.10.3.tgz",
+      "integrity": "sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-displace": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.10.3.tgz",
+      "integrity": "sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-dither": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.10.3.tgz",
+      "integrity": "sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-fisheye": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.10.3.tgz",
+      "integrity": "sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-flip": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.10.3.tgz",
+      "integrity": "sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-gaussian": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.10.3.tgz",
+      "integrity": "sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-invert": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.10.3.tgz",
+      "integrity": "sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-mask": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.10.3.tgz",
+      "integrity": "sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-normalize": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.10.3.tgz",
+      "integrity": "sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-print": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.10.3.tgz",
+      "integrity": "sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "load-bmfont": "^1.4.0"
+      }
+    },
+    "@jimp/plugin-resize": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.10.3.tgz",
+      "integrity": "sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-rotate": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.10.3.tgz",
+      "integrity": "sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-scale": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.10.3.tgz",
+      "integrity": "sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-shadow": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.10.3.tgz",
+      "integrity": "sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugin-threshold": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.10.3.tgz",
+      "integrity": "sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1"
+      }
+    },
+    "@jimp/plugins": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.10.3.tgz",
+      "integrity": "sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/plugin-blit": "^0.10.3",
+        "@jimp/plugin-blur": "^0.10.3",
+        "@jimp/plugin-circle": "^0.10.3",
+        "@jimp/plugin-color": "^0.10.3",
+        "@jimp/plugin-contain": "^0.10.3",
+        "@jimp/plugin-cover": "^0.10.3",
+        "@jimp/plugin-crop": "^0.10.3",
+        "@jimp/plugin-displace": "^0.10.3",
+        "@jimp/plugin-dither": "^0.10.3",
+        "@jimp/plugin-fisheye": "^0.10.3",
+        "@jimp/plugin-flip": "^0.10.3",
+        "@jimp/plugin-gaussian": "^0.10.3",
+        "@jimp/plugin-invert": "^0.10.3",
+        "@jimp/plugin-mask": "^0.10.3",
+        "@jimp/plugin-normalize": "^0.10.3",
+        "@jimp/plugin-print": "^0.10.3",
+        "@jimp/plugin-resize": "^0.10.3",
+        "@jimp/plugin-rotate": "^0.10.3",
+        "@jimp/plugin-scale": "^0.10.3",
+        "@jimp/plugin-shadow": "^0.10.3",
+        "@jimp/plugin-threshold": "^0.10.3",
+        "core-js": "^3.4.1",
+        "timm": "^1.6.1"
+      }
+    },
+    "@jimp/png": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.10.3.tgz",
+      "integrity": "sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/utils": "^0.10.3",
+        "core-js": "^3.4.1",
+        "pngjs": "^3.3.3"
+      },
+      "dependencies": {
+        "pngjs": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+          "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+          "dev": true
+        }
+      }
+    },
+    "@jimp/tiff": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.10.3.tgz",
+      "integrity": "sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "core-js": "^3.4.1",
+        "utif": "^2.0.1"
+      }
+    },
+    "@jimp/types": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.10.3.tgz",
+      "integrity": "sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/bmp": "^0.10.3",
+        "@jimp/gif": "^0.10.3",
+        "@jimp/jpeg": "^0.10.3",
+        "@jimp/png": "^0.10.3",
+        "@jimp/tiff": "^0.10.3",
+        "core-js": "^3.4.1",
+        "timm": "^1.6.1"
+      }
+    },
+    "@jimp/utils": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.10.3.tgz",
+      "integrity": "sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "core-js": "^3.4.1",
+        "regenerator-runtime": "^0.13.3"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.13.11",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+          "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+          "dev": true
+        }
+      }
+    },
+    "@mrmlnc/readdir-enhanced": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=",
+      "dev": true,
+      "requires": {
+        "call-me-maybe": "^1.0.1",
+        "glob-to-regexp": "^0.3.0"
+      }
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+          "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+          "dev": true
+        }
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "1.1.3",
+      "resolved": "https://registry.nlark.com/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz?cache=0&sync_timestamp=1622792772584&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-1.1.3.tgz",
+      "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@sinonjs/commons": {
+      "version": "1.8.6",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+      "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+      "dev": true,
+      "requires": {
+        "type-detect": "4.0.8"
+      }
+    },
+    "@soda/friendly-errors-webpack-plugin": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz?cache=0&sync_timestamp=1607927401282&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40soda%2Ffriendly-errors-webpack-plugin%2Fdownload%2F%40soda%2Ffriendly-errors-webpack-plugin-1.8.0.tgz",
+      "integrity": "sha1-hHUdgqkwGdXJLAzw5FrFkIfNIkA=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "error-stack-parser": "^2.0.2",
+        "string-width": "^2.0.0",
+        "strip-ansi": "^5"
+      },
+      "dependencies": {
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
+          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "@soda/get-current-script": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/@soda/get-current-script/download/@soda/get-current-script-1.0.2.tgz",
+      "integrity": "sha1-pTUV2yXYA4N0OBtzryC7Ty5QjYc=",
+      "dev": true
+    },
+    "@types/babel__core": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+      "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      },
+      "dependencies": {
+        "@babel/helper-validator-identifier": {
+          "version": "7.24.5",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz",
+          "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==",
+          "dev": true
+        },
+        "@babel/parser": {
+          "version": "7.24.5",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz",
+          "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==",
+          "dev": true
+        },
+        "@babel/types": {
+          "version": "7.24.5",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz",
+          "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-string-parser": "^7.24.1",
+            "@babel/helper-validator-identifier": "^7.24.5",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@types/babel__generator": {
+      "version": "7.6.8",
+      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+      "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__template": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+      "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__traverse": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz",
+      "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.20.7"
+      },
+      "dependencies": {
+        "@babel/helper-validator-identifier": {
+          "version": "7.24.5",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz",
+          "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==",
+          "dev": true
+        },
+        "@babel/types": {
+          "version": "7.24.5",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz",
+          "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-string-parser": "^7.24.1",
+            "@babel/helper-validator-identifier": "^7.24.5",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@types/base-64": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@types/base-64/-/base-64-1.0.0.tgz",
+      "integrity": "sha512-AvCJx/HrfYHmOQRFdVvgKMplXfzTUizmh0tz9GFTpDePWgCY4uoKll84zKlaRoeiYiCr7c9ZnqSTzkl0BUVD6g=="
+    },
+    "@types/body-parser": {
+      "version": "1.19.1",
+      "resolved": "https://registry.nlark.com/@types/body-parser/download/@types/body-parser-1.19.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fbody-parser%2Fdownload%2F%40types%2Fbody-parser-1.19.1.tgz",
+      "integrity": "sha1-DAF0xCp9AXuBgwPUtdlpywt1kpw=",
+      "dev": true,
+      "requires": {
+        "@types/connect": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/connect": {
+      "version": "3.4.35",
+      "resolved": "https://registry.nlark.com/@types/connect/download/@types/connect-3.4.35.tgz",
+      "integrity": "sha1-X89q5EXkAh0fwiGaSHPMc6O7KtE=",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/connect-history-api-fallback": {
+      "version": "1.3.5",
+      "resolved": "https://registry.nlark.com/@types/connect-history-api-fallback/download/@types/connect-history-api-fallback-1.3.5.tgz?cache=0&sync_timestamp=1629707001404&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fconnect-history-api-fallback%2Fdownload%2F%40types%2Fconnect-history-api-fallback-1.3.5.tgz",
+      "integrity": "sha1-0feooJ0O1aV67lrpwYq5uAMgXa4=",
+      "dev": true,
+      "requires": {
+        "@types/express-serve-static-core": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/express": {
+      "version": "4.17.13",
+      "resolved": "https://registry.nlark.com/@types/express/download/@types/express-4.17.13.tgz?cache=0&sync_timestamp=1629707695416&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fexpress%2Fdownload%2F%40types%2Fexpress-4.17.13.tgz",
+      "integrity": "sha1-p24plXKJmbq1GjP6vOHXBaNwkDQ=",
+      "dev": true,
+      "requires": {
+        "@types/body-parser": "*",
+        "@types/express-serve-static-core": "^4.17.18",
+        "@types/qs": "*",
+        "@types/serve-static": "*"
+      }
+    },
+    "@types/express-serve-static-core": {
+      "version": "4.17.24",
+      "resolved": "https://registry.nlark.com/@types/express-serve-static-core/download/@types/express-serve-static-core-4.17.24.tgz",
+      "integrity": "sha1-6kH5O/fg1ZzVp2ZlBo7WqraBXAc=",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/qs": "*",
+        "@types/range-parser": "*"
+      }
+    },
+    "@types/formidable": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-1.2.8.tgz",
+      "integrity": "sha512-6psvrUy5VDYb+yaPJReF1WrRsz+FBwyJutK9Twz1Efa27tm07bARNIkK2B8ZPWq80dXqpKfrxTO96xrtPp+AuA==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/glob": {
+      "version": "7.1.4",
+      "resolved": "https://registry.nlark.com/@types/glob/download/@types/glob-7.1.4.tgz",
+      "integrity": "sha1-6lniHS7lxReRTLS8jkFTuZ5WZnI=",
+      "dev": true,
+      "requires": {
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/graceful-fs": {
+      "version": "4.1.9",
+      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+      "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/http-proxy": {
+      "version": "1.17.7",
+      "resolved": "https://registry.nlark.com/@types/http-proxy/download/@types/http-proxy-1.17.7.tgz",
+      "integrity": "sha1-MOqFzCyGg2g1Kjfw0NNYHiSDTG8=",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/istanbul-lib-coverage": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+      "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+      "dev": true
+    },
+    "@types/istanbul-lib-report": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+      "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "*"
+      }
+    },
+    "@types/istanbul-reports": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
+      "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "*",
+        "@types/istanbul-lib-report": "*"
+      }
+    },
+    "@types/js-base64": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@types/js-base64/-/js-base64-3.3.1.tgz",
+      "integrity": "sha512-Zw33oQNAvDdAN9b0IE5stH0y2MylYvtU7VVTKEJPxhyM2q57CVaNJhtJW258ah24NRtaiA23tptUmVn3dmTKpw==",
+      "requires": {
+        "js-base64": "*"
+      }
+    },
+    "@types/json-schema": {
+      "version": "7.0.9",
+      "resolved": "https://registry.nlark.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz",
+      "integrity": "sha1-l+3JA36gw4WFMgsolk3eOznkZg0="
+    },
+    "@types/lodash": {
+      "version": "4.14.172",
+      "resolved": "https://registry.nlark.com/@types/lodash/download/@types/lodash-4.14.172.tgz?cache=0&sync_timestamp=1629708216703&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Flodash%2Fdownload%2F%40types%2Flodash-4.14.172.tgz",
+      "integrity": "sha1-qtd0wo57/Xpn3iVAjgPuWow9Aoo="
+    },
+    "@types/mime": {
+      "version": "1.3.2",
+      "resolved": "https://registry.nlark.com/@types/mime/download/@types/mime-1.3.2.tgz?cache=0&sync_timestamp=1629708403517&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fmime%2Fdownload%2F%40types%2Fmime-1.3.2.tgz",
+      "integrity": "sha1-k+Jb+e51/g/YC1lLxP6w6GIRG1o=",
+      "dev": true
+    },
+    "@types/minimatch": {
+      "version": "3.0.5",
+      "resolved": "https://registry.nlark.com/@types/minimatch/download/@types/minimatch-3.0.5.tgz?cache=0&sync_timestamp=1629708337307&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fminimatch%2Fdownload%2F%40types%2Fminimatch-3.0.5.tgz",
+      "integrity": "sha1-EAHMXmo3BLg8I2An538vWOoBD0A=",
+      "dev": true
+    },
+    "@types/minimist": {
+      "version": "1.2.2",
+      "resolved": "https://registry.nlark.com/@types/minimist/download/@types/minimist-1.2.2.tgz?cache=0&sync_timestamp=1629708337116&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fminimist%2Fdownload%2F%40types%2Fminimist-1.2.2.tgz",
+      "integrity": "sha1-7nceK6Sz3Fs3KTXVSf2WF780W4w=",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "16.7.11",
+      "resolved": "https://registry.nlark.com/@types/node/download/@types/node-16.7.11.tgz?cache=0&sync_timestamp=1630966509413&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-16.7.11.tgz",
+      "integrity": "sha1-WHezqzWa8lH9QTUXvi1CZbf+qak="
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.1",
+      "resolved": "https://registry.nlark.com/@types/normalize-package-data/download/@types/normalize-package-data-2.4.1.tgz?cache=0&sync_timestamp=1629708441689&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnormalize-package-data%2Fdownload%2F%40types%2Fnormalize-package-data-2.4.1.tgz",
+      "integrity": "sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE=",
+      "dev": true
+    },
+    "@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+      "dev": true,
+      "optional": true
+    },
+    "@types/prettier": {
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz",
+      "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==",
+      "dev": true
+    },
+    "@types/q": {
+      "version": "1.5.5",
+      "resolved": "https://registry.nlark.com/@types/q/download/@types/q-1.5.5.tgz?cache=0&sync_timestamp=1629708761534&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fq%2Fdownload%2F%40types%2Fq-1.5.5.tgz",
+      "integrity": "sha1-daKo59irSyMEFFBdkjNdHctTpt8=",
+      "dev": true
+    },
+    "@types/qs": {
+      "version": "6.9.7",
+      "resolved": "https://registry.nlark.com/@types/qs/download/@types/qs-6.9.7.tgz?cache=0&sync_timestamp=1629708766601&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fqs%2Fdownload%2F%40types%2Fqs-6.9.7.tgz",
+      "integrity": "sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss=",
+      "dev": true
+    },
+    "@types/range-parser": {
+      "version": "1.2.4",
+      "resolved": "https://registry.nlark.com/@types/range-parser/download/@types/range-parser-1.2.4.tgz?cache=0&sync_timestamp=1629708894355&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Frange-parser%2Fdownload%2F%40types%2Frange-parser-1.2.4.tgz",
+      "integrity": "sha1-zWZ7z90CUhOq+3ylkVqTJZCs3Nw=",
+      "dev": true
+    },
+    "@types/serve-static": {
+      "version": "1.13.10",
+      "resolved": "https://registry.nlark.com/@types/serve-static/download/@types/serve-static-1.13.10.tgz?cache=0&sync_timestamp=1629709282856&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fserve-static%2Fdownload%2F%40types%2Fserve-static-1.13.10.tgz",
+      "integrity": "sha1-9eDOh5fS18xevtpIpSyWxPpHqNk=",
+      "dev": true,
+      "requires": {
+        "@types/mime": "^1",
+        "@types/node": "*"
+      }
+    },
+    "@types/source-list-map": {
+      "version": "0.1.2",
+      "resolved": "https://registry.nlark.com/@types/source-list-map/download/@types/source-list-map-0.1.2.tgz?cache=0&sync_timestamp=1629709261080&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fsource-list-map%2Fdownload%2F%40types%2Fsource-list-map-0.1.2.tgz",
+      "integrity": "sha1-AHiDYGP/rxdBI0m7o2QIfgrALsk=",
+      "dev": true
+    },
+    "@types/stack-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
+      "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
+      "dev": true
+    },
+    "@types/tapable": {
+      "version": "1.0.8",
+      "resolved": "https://registry.nlark.com/@types/tapable/download/@types/tapable-1.0.8.tgz?cache=0&sync_timestamp=1629709441343&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Ftapable%2Fdownload%2F%40types%2Ftapable-1.0.8.tgz",
+      "integrity": "sha1-uUpDkchWZse3Mpn9OtedT6pDUxA=",
+      "dev": true
+    },
+    "@types/uglify-js": {
+      "version": "3.13.1",
+      "resolved": "https://registry.nlark.com/@types/uglify-js/download/@types/uglify-js-3.13.1.tgz",
+      "integrity": "sha1-XoienoHpQkXHW2RQYA4cXqKHiuo=",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      }
+    },
+    "@types/utf8": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/utf8/-/utf8-3.0.1.tgz",
+      "integrity": "sha512-1EkWuw7rT3BMz2HpmcEOr/HL61mWNA6Ulr/KdbXR9AI0A55wD4Qfv8hizd8Q1DnknSIzzDvQmvvY/guvX7jjZA=="
+    },
+    "@types/webpack": {
+      "version": "4.41.30",
+      "resolved": "https://registry.nlark.com/@types/webpack/download/@types/webpack-4.41.30.tgz?cache=0&sync_timestamp=1629709718163&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fwebpack%2Fdownload%2F%40types%2Fwebpack-4.41.30.tgz",
+      "integrity": "sha1-/T220NQeFFqO7q/NPEp8zekGjdw=",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/tapable": "^1",
+        "@types/uglify-js": "*",
+        "@types/webpack-sources": "*",
+        "anymatch": "^3.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "@types/webpack-dev-server": {
+      "version": "3.11.6",
+      "resolved": "https://registry.nlark.com/@types/webpack-dev-server/download/@types/webpack-dev-server-3.11.6.tgz?cache=0&sync_timestamp=1630452240230&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fwebpack-dev-server%2Fdownload%2F%40types%2Fwebpack-dev-server-3.11.6.tgz",
+      "integrity": "sha1-2IiM/S8GMCA+E9PteDOk0RuKNNw=",
+      "dev": true,
+      "requires": {
+        "@types/connect-history-api-fallback": "*",
+        "@types/express": "*",
+        "@types/serve-static": "*",
+        "@types/webpack": "^4",
+        "http-proxy-middleware": "^1.0.0"
+      }
+    },
+    "@types/webpack-env": {
+      "version": "1.16.2",
+      "resolved": "https://registry.nlark.com/@types/webpack-env/download/@types/webpack-env-1.16.2.tgz",
+      "integrity": "sha1-jbUUsFnBsq4Uzp17syUpbeapoPo=",
+      "dev": true
+    },
+    "@types/webpack-sources": {
+      "version": "3.2.0",
+      "resolved": "https://registry.nlark.com/@types/webpack-sources/download/@types/webpack-sources-3.2.0.tgz?cache=0&sync_timestamp=1629709756861&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fwebpack-sources%2Fdownload%2F%40types%2Fwebpack-sources-3.2.0.tgz",
+      "integrity": "sha1-FtdZuglsKJA0smVT0t8b9FJI04s=",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/source-list-map": "*",
+        "source-map": "^0.7.3"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz",
+          "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=",
+          "dev": true
+        }
+      }
+    },
+    "@types/yargs": {
+      "version": "15.0.19",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz",
+      "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==",
+      "dev": true,
+      "requires": {
+        "@types/yargs-parser": "*"
+      }
+    },
+    "@types/yargs-parser": {
+      "version": "21.0.3",
+      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+      "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+      "dev": true
+    },
+    "@vue/babel-helper-vue-jsx-merge-props": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz",
+      "integrity": "sha1-MWJKelBfsU2h1YAjclpMXycOaoE="
+    },
+    "@vue/babel-helper-vue-transform-on": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-transform-on/download/@vue/babel-helper-vue-transform-on-1.0.2.tgz?cache=0&sync_timestamp=1610812436327&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-helper-vue-transform-on%2Fdownload%2F%40vue%2Fbabel-helper-vue-transform-on-1.0.2.tgz",
+      "integrity": "sha1-m5xpHNBvyFUiGiR1w8yDHXdLx9w=",
+      "dev": true
+    },
+    "@vue/babel-plugin-jsx": {
+      "version": "1.0.7",
+      "resolved": "https://registry.nlark.com/@vue/babel-plugin-jsx/download/@vue/babel-plugin-jsx-1.0.7.tgz",
+      "integrity": "sha1-ItbITvjbWsE9uXFHalXMUhWQIWg=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.0.0",
+        "@babel/template": "^7.0.0",
+        "@babel/traverse": "^7.0.0",
+        "@babel/types": "^7.0.0",
+        "@vue/babel-helper-vue-transform-on": "^1.0.2",
+        "camelcase": "^6.0.0",
+        "html-tags": "^3.1.0",
+        "svg-tags": "^1.0.0"
+      }
+    },
+    "@vue/babel-plugin-transform-vue-jsx": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.2.1.tgz?cache=0&sync_timestamp=1602851123835&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-plugin-transform-vue-jsx%2Fdownload%2F%40vue%2Fbabel-plugin-transform-vue-jsx-1.2.1.tgz",
+      "integrity": "sha1-ZGBGxlLC8CQnJ/NFGdkXsGQEHtc=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+        "html-tags": "^2.0.0",
+        "lodash.kebabcase": "^4.1.1",
+        "svg-tags": "^1.0.0"
+      },
+      "dependencies": {
+        "html-tags": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz",
+          "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/babel-preset-app": {
+      "version": "4.5.13",
+      "resolved": "https://registry.nlark.com/@vue/babel-preset-app/download/@vue/babel-preset-app-4.5.13.tgz?cache=0&sync_timestamp=1628579324855&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fbabel-preset-app%2Fdownload%2F%40vue%2Fbabel-preset-app-4.5.13.tgz",
+      "integrity": "sha1-y0dTIeTHP38RDawppIwqnLgK/rY=",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.11.0",
+        "@babel/helper-compilation-targets": "^7.9.6",
+        "@babel/helper-module-imports": "^7.8.3",
+        "@babel/plugin-proposal-class-properties": "^7.8.3",
+        "@babel/plugin-proposal-decorators": "^7.8.3",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-jsx": "^7.8.3",
+        "@babel/plugin-transform-runtime": "^7.11.0",
+        "@babel/preset-env": "^7.11.0",
+        "@babel/runtime": "^7.11.0",
+        "@vue/babel-plugin-jsx": "^1.0.3",
+        "@vue/babel-preset-jsx": "^1.2.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3",
+        "core-js": "^3.6.5",
+        "core-js-compat": "^3.6.5",
+        "semver": "^6.1.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/babel-preset-jsx": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.2.4.tgz?cache=0&sync_timestamp=1603806765718&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-preset-jsx%2Fdownload%2F%40vue%2Fbabel-preset-jsx-1.2.4.tgz",
+      "integrity": "sha1-kv6nnbbxOwHoDToAmeKSS9y+Toc=",
+      "dev": true,
+      "requires": {
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+        "@vue/babel-sugar-composition-api-inject-h": "^1.2.1",
+        "@vue/babel-sugar-composition-api-render-instance": "^1.2.4",
+        "@vue/babel-sugar-functional-vue": "^1.2.2",
+        "@vue/babel-sugar-inject-h": "^1.2.2",
+        "@vue/babel-sugar-v-model": "^1.2.3",
+        "@vue/babel-sugar-v-on": "^1.2.3"
+      }
+    },
+    "@vue/babel-sugar-composition-api-inject-h": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-composition-api-inject-h/download/@vue/babel-sugar-composition-api-inject-h-1.2.1.tgz?cache=0&sync_timestamp=1602851168666&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-composition-api-inject-h%2Fdownload%2F%40vue%2Fbabel-sugar-composition-api-inject-h-1.2.1.tgz",
+      "integrity": "sha1-BdbgxDJxDjdYKyvppgSbaJtvA+s=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-composition-api-render-instance": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-composition-api-render-instance/download/@vue/babel-sugar-composition-api-render-instance-1.2.4.tgz?cache=0&sync_timestamp=1603806931432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-composition-api-render-instance%2Fdownload%2F%40vue%2Fbabel-sugar-composition-api-render-instance-1.2.4.tgz",
+      "integrity": "sha1-5MvGmXw0T6wnF4WteikyXFHWjRk=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-functional-vue": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.2.2.tgz?cache=0&sync_timestamp=1602929625505&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-functional-vue%2Fdownload%2F%40vue%2Fbabel-sugar-functional-vue-1.2.2.tgz",
+      "integrity": "sha1-JnqayNeHyW7b8Dzj85LEnam9Jlg=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-inject-h": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.2.2.tgz?cache=0&sync_timestamp=1602929625678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-inject-h%2Fdownload%2F%40vue%2Fbabel-sugar-inject-h-1.2.2.tgz",
+      "integrity": "sha1-1zjTyJM2fshJHcu2abAAkZKT46o=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-v-model": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.2.3.tgz?cache=0&sync_timestamp=1603184320789&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-v-model%2Fdownload%2F%40vue%2Fbabel-sugar-v-model-1.2.3.tgz",
+      "integrity": "sha1-+h8pulHr8KoabDX6ZtU5vEWaGPI=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+        "camelcase": "^5.0.0",
+        "html-tags": "^2.0.0",
+        "svg-tags": "^1.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1603921799543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz",
+          "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+          "dev": true
+        },
+        "html-tags": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz",
+          "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/babel-sugar-v-on": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.2.3.tgz?cache=0&sync_timestamp=1603181880042&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-v-on%2Fdownload%2F%40vue%2Fbabel-sugar-v-on-1.2.3.tgz",
+      "integrity": "sha1-NCNnF4WGpp85LwS/ujICHQKROto=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+        "camelcase": "^5.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1603921799543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz",
+          "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-overlay": {
+      "version": "4.5.13",
+      "resolved": "https://registry.nlark.com/@vue/cli-overlay/download/@vue/cli-overlay-4.5.13.tgz?cache=0&sync_timestamp=1628579301004&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-overlay%2Fdownload%2F%40vue%2Fcli-overlay-4.5.13.tgz",
+      "integrity": "sha1-Tx/SFhvo9p1suoB58/DX3E3uR6c=",
+      "dev": true
+    },
+    "@vue/cli-plugin-babel": {
+      "version": "4.5.13",
+      "resolved": "https://registry.nlark.com/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-4.5.13.tgz?cache=0&sync_timestamp=1628579326004&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-plugin-babel%2Fdownload%2F%40vue%2Fcli-plugin-babel-4.5.13.tgz",
+      "integrity": "sha1-qJxILtzE6h0TVkXOxQKn9f1MMOc=",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.11.0",
+        "@vue/babel-preset-app": "^4.5.13",
+        "@vue/cli-shared-utils": "^4.5.13",
+        "babel-loader": "^8.1.0",
+        "cache-loader": "^4.1.0",
+        "thread-loader": "^2.1.3",
+        "webpack": "^4.0.0"
+      }
+    },
+    "@vue/cli-plugin-router": {
+      "version": "4.5.13",
+      "resolved": "https://registry.nlark.com/@vue/cli-plugin-router/download/@vue/cli-plugin-router-4.5.13.tgz",
+      "integrity": "sha1-C2fIiYor8TKUGRmiouXzqsvZ/74=",
+      "dev": true,
+      "requires": {
+        "@vue/cli-shared-utils": "^4.5.13"
+      }
+    },
+    "@vue/cli-plugin-typescript": {
+      "version": "4.5.13",
+      "resolved": "https://registry.nlark.com/@vue/cli-plugin-typescript/download/@vue/cli-plugin-typescript-4.5.13.tgz?cache=0&sync_timestamp=1628579630974&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-plugin-typescript%2Fdownload%2F%40vue%2Fcli-plugin-typescript-4.5.13.tgz",
+      "integrity": "sha1-9RT2YeFvkJaompym5potdixthGQ=",
+      "dev": true,
+      "requires": {
+        "@types/webpack-env": "^1.15.2",
+        "@vue/cli-shared-utils": "^4.5.13",
+        "cache-loader": "^4.1.0",
+        "fork-ts-checker-webpack-plugin": "^3.1.1",
+        "fork-ts-checker-webpack-plugin-v5": "npm:fork-ts-checker-webpack-plugin@^5.0.11",
+        "globby": "^9.2.0",
+        "thread-loader": "^2.1.3",
+        "ts-loader": "^6.2.2",
+        "tslint": "^5.20.1",
+        "webpack": "^4.0.0",
+        "yorkie": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "cosmiconfig": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+          "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "@types/parse-json": "^4.0.0",
+            "import-fresh": "^3.1.0",
+            "parse-json": "^5.0.0",
+            "path-type": "^4.0.0",
+            "yaml": "^1.7.2"
+          }
+        },
+        "deepmerge": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+          "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+          "dev": true,
+          "optional": true
+        },
+        "fork-ts-checker-webpack-plugin-v5": {
+          "version": "npm:fork-ts-checker-webpack-plugin@5.2.1",
+          "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz",
+          "integrity": "sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@types/json-schema": "^7.0.5",
+            "chalk": "^4.1.0",
+            "cosmiconfig": "^6.0.0",
+            "deepmerge": "^4.2.2",
+            "fs-extra": "^9.0.0",
+            "memfs": "^3.1.2",
+            "minimatch": "^3.0.4",
+            "schema-utils": "2.7.0",
+            "semver": "^7.3.2",
+            "tapable": "^1.0.0"
+          }
+        },
+        "fs-extra": {
+          "version": "9.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "at-least-node": "^1.0.0",
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^2.0.0"
+          }
+        },
+        "globby": {
+          "version": "9.2.0",
+          "resolved": "https://registry.nlark.com/globby/download/globby-9.2.0.tgz",
+          "integrity": "sha1-/QKacGxwPSm90XD0tts6P3p8tj0=",
+          "dev": true,
+          "requires": {
+            "@types/glob": "^7.1.1",
+            "array-union": "^1.0.2",
+            "dir-glob": "^2.2.2",
+            "fast-glob": "^2.2.6",
+            "glob": "^7.1.3",
+            "ignore": "^4.0.3",
+            "pify": "^4.0.1",
+            "slash": "^2.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz",
+          "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
+          "dev": true
+        },
+        "import-fresh": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "jsonfile": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^2.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+          "dev": true,
+          "optional": true
+        },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+          "dev": true,
+          "optional": true
+        },
+        "schema-utils": {
+          "version": "2.7.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+          "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "@types/json-schema": "^7.0.4",
+            "ajv": "^6.12.2",
+            "ajv-keywords": "^3.4.1"
+          }
+        },
+        "semver": {
+          "version": "7.6.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+          "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz",
+          "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "universalify": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+          "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+          "dev": true,
+          "optional": true
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "@vue/cli-plugin-vuex": {
+      "version": "4.5.13",
+      "resolved": "https://registry.nlark.com/@vue/cli-plugin-vuex/download/@vue/cli-plugin-vuex-4.5.13.tgz",
+      "integrity": "sha1-mGRti8HmnPbGpsui/tPqzgNWw2A=",
+      "dev": true
+    },
+    "@vue/cli-service": {
+      "version": "4.5.13",
+      "resolved": "https://registry.nlark.com/@vue/cli-service/download/@vue/cli-service-4.5.13.tgz?cache=0&sync_timestamp=1628579326809&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-service%2Fdownload%2F%40vue%2Fcli-service-4.5.13.tgz",
+      "integrity": "sha1-oJ5oSoAWhLbiTlQUrTBlCXDuye0=",
+      "dev": true,
+      "requires": {
+        "@intervolga/optimize-cssnano-plugin": "^1.0.5",
+        "@soda/friendly-errors-webpack-plugin": "^1.7.1",
+        "@soda/get-current-script": "^1.0.0",
+        "@types/minimist": "^1.2.0",
+        "@types/webpack": "^4.0.0",
+        "@types/webpack-dev-server": "^3.11.0",
+        "@vue/cli-overlay": "^4.5.13",
+        "@vue/cli-plugin-router": "^4.5.13",
+        "@vue/cli-plugin-vuex": "^4.5.13",
+        "@vue/cli-shared-utils": "^4.5.13",
+        "@vue/component-compiler-utils": "^3.1.2",
+        "@vue/preload-webpack-plugin": "^1.1.0",
+        "@vue/web-component-wrapper": "^1.2.0",
+        "acorn": "^7.4.0",
+        "acorn-walk": "^7.1.1",
+        "address": "^1.1.2",
+        "autoprefixer": "^9.8.6",
+        "browserslist": "^4.12.0",
+        "cache-loader": "^4.1.0",
+        "case-sensitive-paths-webpack-plugin": "^2.3.0",
+        "cli-highlight": "^2.1.4",
+        "clipboardy": "^2.3.0",
+        "cliui": "^6.0.0",
+        "copy-webpack-plugin": "^5.1.1",
+        "css-loader": "^3.5.3",
+        "cssnano": "^4.1.10",
+        "debug": "^4.1.1",
+        "default-gateway": "^5.0.5",
+        "dotenv": "^8.2.0",
+        "dotenv-expand": "^5.1.0",
+        "file-loader": "^4.2.0",
+        "fs-extra": "^7.0.1",
+        "globby": "^9.2.0",
+        "hash-sum": "^2.0.0",
+        "html-webpack-plugin": "^3.2.0",
+        "launch-editor-middleware": "^2.2.1",
+        "lodash.defaultsdeep": "^4.6.1",
+        "lodash.mapvalues": "^4.6.0",
+        "lodash.transform": "^4.6.0",
+        "mini-css-extract-plugin": "^0.9.0",
+        "minimist": "^1.2.5",
+        "pnp-webpack-plugin": "^1.6.4",
+        "portfinder": "^1.0.26",
+        "postcss-loader": "^3.0.0",
+        "ssri": "^8.0.1",
+        "terser-webpack-plugin": "^1.4.4",
+        "thread-loader": "^2.1.3",
+        "url-loader": "^2.2.0",
+        "vue-loader": "^15.9.2",
+        "vue-loader-v16": "npm:vue-loader@^16.1.0",
+        "vue-style-loader": "^4.1.2",
+        "webpack": "^4.0.0",
+        "webpack-bundle-analyzer": "^3.8.0",
+        "webpack-chain": "^6.4.0",
+        "webpack-dev-server": "^3.11.0",
+        "webpack-merge": "^4.2.2"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz",
+          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "globby": {
+          "version": "9.2.0",
+          "resolved": "https://registry.nlark.com/globby/download/globby-9.2.0.tgz",
+          "integrity": "sha1-/QKacGxwPSm90XD0tts6P3p8tj0=",
+          "dev": true,
+          "requires": {
+            "@types/glob": "^7.1.1",
+            "array-union": "^1.0.2",
+            "dir-glob": "^2.2.2",
+            "fast-glob": "^2.2.6",
+            "glob": "^7.1.3",
+            "ignore": "^4.0.3",
+            "pify": "^4.0.1",
+            "slash": "^2.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "hash-sum": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz",
+          "integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=",
+          "dev": true
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz",
+          "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
+          "dev": true
+        },
+        "json5": {
+          "version": "2.2.3",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+          "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz",
+          "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
+          "dev": true
+        },
+        "ssri": {
+          "version": "8.0.1",
+          "resolved": "https://registry.nlark.com/ssri/download/ssri-8.0.1.tgz",
+          "integrity": "sha1-Y45OQ54v+9LNKJd21cpFfE9Roq8=",
+          "dev": true,
+          "requires": {
+            "minipass": "^3.1.1"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@vue/cli-shared-utils": {
+      "version": "4.5.13",
+      "resolved": "https://registry.nlark.com/@vue/cli-shared-utils/download/@vue/cli-shared-utils-4.5.13.tgz?cache=0&sync_timestamp=1628579279194&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcli-shared-utils%2Fdownload%2F%40vue%2Fcli-shared-utils-4.5.13.tgz",
+      "integrity": "sha1-rNQPMbR5DxY0KSvapfypXcHg/1A=",
+      "dev": true,
+      "requires": {
+        "@hapi/joi": "^15.0.1",
+        "chalk": "^2.4.2",
+        "execa": "^1.0.0",
+        "launch-editor": "^2.2.1",
+        "lru-cache": "^5.1.1",
+        "node-ipc": "^9.1.1",
+        "open": "^6.3.0",
+        "ora": "^3.4.0",
+        "read-pkg": "^5.1.1",
+        "request": "^2.88.2",
+        "semver": "^6.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
+          "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/component-compiler-utils": {
+      "version": "3.2.2",
+      "resolved": "https://registry.nlark.com/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.2.2.tgz?cache=0&sync_timestamp=1623744211654&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcomponent-compiler-utils%2Fdownload%2F%40vue%2Fcomponent-compiler-utils-3.2.2.tgz",
+      "integrity": "sha1-L37V/u2C/38ChKzBHVJe5+/yJGA=",
+      "requires": {
+        "consolidate": "^0.15.1",
+        "hash-sum": "^1.0.2",
+        "lru-cache": "^4.1.2",
+        "merge-source-map": "^1.1.0",
+        "postcss": "^7.0.36",
+        "postcss-selector-parser": "^6.0.2",
+        "prettier": "^1.18.2",
+        "source-map": "~0.6.1",
+        "vue-template-es2015-compiler": "^1.9.0"
+      },
+      "dependencies": {
+        "cssesc": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz",
+          "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4="
+        },
+        "postcss-selector-parser": {
+          "version": "6.0.6",
+          "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-6.0.6.tgz?cache=0&sync_timestamp=1620752924836&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.6.tgz",
+          "integrity": "sha1-LFu6gXSsL2mBq2MaQqsO5UrzMuo=",
+          "requires": {
+            "cssesc": "^3.0.0",
+            "util-deprecate": "^1.0.2"
+          }
+        }
+      }
+    },
+    "@vue/preload-webpack-plugin": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.2.tgz?cache=0&sync_timestamp=1613215133431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fpreload-webpack-plugin%2Fdownload%2F%40vue%2Fpreload-webpack-plugin-1.1.2.tgz",
+      "integrity": "sha1-zrkktOyzucQ4ccekKaAvhCPmIas=",
+      "dev": true
+    },
+    "@vue/shared": {
+      "version": "3.4.27",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz",
+      "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA=="
+    },
+    "@vue/web-component-wrapper": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.3.0.tgz?cache=0&sync_timestamp=1613216912643&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fweb-component-wrapper%2Fdownload%2F%40vue%2Fweb-component-wrapper-1.3.0.tgz",
+      "integrity": "sha1-trQKdiVCnSvXwigd26YB7QXcfxo=",
+      "dev": true
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/ast/download/@webassemblyjs/ast-1.9.0.tgz",
+      "integrity": "sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ=",
+      "requires": {
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha1-PD07Jxvd/ITesA9xNEQ4MR1S/7Q="
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.9.0.tgz?cache=0&sync_timestamp=1625473346773&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-api-error%2Fdownload%2F%40webassemblyjs%2Fhelper-api-error-1.9.0.tgz",
+      "integrity": "sha1-ID9nbjM7lsnaLuqzzO8zxFkotqI="
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.9.0.tgz",
+      "integrity": "sha1-oUQtJpxf6yP8vJ73WdrDVH8p3gA="
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.9.0.tgz?cache=0&sync_timestamp=1625473466896&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-code-frame%2Fdownload%2F%40webassemblyjs%2Fhelper-code-frame-1.9.0.tgz",
+      "integrity": "sha1-ZH+Iks0gQ6gqwMjF51w28dkVnyc=",
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.9.0.tgz",
+      "integrity": "sha1-wFJWtxJEIUZx9LCOwQitY7cO3bg="
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.9.0.tgz",
+      "integrity": "sha1-JdiIS3aDmHGgimxvgGw5ee9xLwc=",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha1-T+2L6sm4wU+MWLcNEk1UndH+V5A="
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.9.0.tgz?cache=0&sync_timestamp=1625473466570&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-wasm-section%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-section-1.9.0.tgz",
+      "integrity": "sha1-WkE41aYpK6GLBMWuSXF+QWeWU0Y=",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.9.0.tgz",
+      "integrity": "sha1-Fceg+6roP7JhQ7us9tbfFwKtOeQ=",
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.9.0.tgz",
+      "integrity": "sha1-8Zygt2ptxVYjoJz/p2noOPoeHJU=",
+      "requires": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.9.0.tgz",
+      "integrity": "sha1-BNM7Y2945qaBMifoJAL3Y3tiKas="
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.9.0.tgz?cache=0&sync_timestamp=1625473422937&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-edit%2Fdownload%2F%40webassemblyjs%2Fwasm-edit-1.9.0.tgz",
+      "integrity": "sha1-P+bXnT8PkiGDqoYALELdJWz+6c8=",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/helper-wasm-section": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-opt": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.9.0.tgz?cache=0&sync_timestamp=1625473464969&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-gen%2Fdownload%2F%40webassemblyjs%2Fwasm-gen-1.9.0.tgz",
+      "integrity": "sha1-ULxw7Gje2OJ2OwGhQYv0NJGnpJw=",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.9.0.tgz?cache=0&sync_timestamp=1625473467198&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-opt%2Fdownload%2F%40webassemblyjs%2Fwasm-opt-1.9.0.tgz",
+      "integrity": "sha1-IhEYHlsxMmRDzIES658LkChyGmE=",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.9.0.tgz",
+      "integrity": "sha1-nUjkSCbfSmWYKUqmyHRp1kL/9l4=",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wast-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.9.0.tgz?cache=0&sync_timestamp=1625473467847&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwast-parser%2Fdownload%2F%40webassemblyjs%2Fwast-parser-1.9.0.tgz",
+      "integrity": "sha1-MDERXXmsW9JhVWzsw/qQo+9FGRQ=",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-code-frame": "1.9.0",
+        "@webassemblyjs/helper-fsm": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.nlark.com/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.9.0.tgz",
+      "integrity": "sha1-STXVTIX+9jewDOn1I3dFHQDUeJk=",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz",
+      "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A="
+    },
+    "@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz",
+      "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0="
+    },
+    "aaptjs": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/aaptjs/-/aaptjs-1.3.2.tgz",
+      "integrity": "sha512-zB1Kyxw7uwUhDYaxWfX41pu6eGzyYzPhfC6Zr3wjEUjaWt0rRQdn3KBmifaB6H60IMcvrvweXZdBEQYWLww4XA==",
+      "requires": {
+        "shelljs": "^0.8.1"
+      }
+    },
+    "abab": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+      "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+      "dev": true
+    },
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+    },
+    "accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz",
+      "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=",
+      "requires": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      }
+    },
+    "acorn": {
+      "version": "5.7.4",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+      "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+      "dev": true
+    },
+    "acorn-globals": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
+      "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
+      "dev": true,
+      "requires": {
+        "acorn": "^6.0.1",
+        "acorn-walk": "^6.0.1"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.4.2",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+          "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+          "dev": true
+        },
+        "acorn-walk": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
+          "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
+          "dev": true
+        }
+      }
+    },
+    "acorn-walk": {
+      "version": "7.2.0",
+      "resolved": "https://registry.nlark.com/acorn-walk/download/acorn-walk-7.2.0.tgz?cache=0&sync_timestamp=1630916608758&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-walk%2Fdownload%2Facorn-walk-7.2.0.tgz",
+      "integrity": "sha1-DeiJpgEgOQmw++B7iTjcIdLpZ7w=",
+      "dev": true
+    },
+    "adb-commander": {
+      "version": "0.1.9",
+      "resolved": "https://registry.npmjs.org/adb-commander/-/adb-commander-0.1.9.tgz",
+      "integrity": "sha512-uFZ+gRLQF4wqkuAQ/bBB22oLHQ8W6HQ31BTCssRtoinMm3oBauAH9e1kUm+cqyc3soGqwUGcsKuKuW37IlMIwA==",
+      "requires": {
+        "adb-driver": "^0.1.8"
+      }
+    },
+    "adb-devices-emitter": {
+      "version": "0.1.9",
+      "resolved": "https://registry.npmjs.org/adb-devices-emitter/-/adb-devices-emitter-0.1.9.tgz",
+      "integrity": "sha512-vR38T3ZqZmCXPQS6p0dEjbHZYAybNk6MLW2evtbVGCQvvrvoTzXSFjIdfrRbxryn9HJ7WAXfH42GYgvZIZDiTA==",
+      "requires": {
+        "adb-commander": "^0.1.9"
+      }
+    },
+    "adb-driver": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/adb-driver/-/adb-driver-0.1.8.tgz",
+      "integrity": "sha512-sERbuWCkIBtoHlEkE3tg67AWUaX/yJskYSLI6DKZsvgr5rL7iVNjMSIB2s7d1zt3luP/BMgLfP5z4Jto+CLafA==",
+      "requires": {
+        "which": "^1.3.1"
+      }
+    },
+    "address": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/address/download/address-1.1.2.tgz",
+      "integrity": "sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY=",
+      "dev": true
+    },
+    "after": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+      "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA=="
+    },
+    "ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.nlark.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1626380096383&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz",
+      "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=",
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz",
+      "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0="
+    },
+    "ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz?cache=0&sync_timestamp=1616882441894&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-keywords%2Fdownload%2Fajv-keywords-3.5.2.tgz",
+      "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0="
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+      "dev": true
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg=="
+    },
+    "ansi-colors": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz?cache=0&sync_timestamp=1594334943016&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-colors%2Fdownload%2Fansi-colors-3.2.4.tgz",
+      "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.21.3"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.21.3",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+          "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+          "dev": true
+        }
+      }
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz",
+      "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc="
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-3.2.1.tgz",
+      "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "any-base": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
+      "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==",
+      "dev": true
+    },
+    "any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz",
+      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
+    },
+    "anymatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz",
+      "integrity": "sha1-wFV8CWrzLxBhmPT04qODU343hxY=",
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz",
+      "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo="
+    },
+    "arch": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/arch/download/arch-2.2.0.tgz",
+      "integrity": "sha1-G8R4GPMFdk8jqzMGsL/AhsWinRE=",
+      "dev": true
+    },
+    "are-we-there-yet": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
+      "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
+      "requires": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz",
+      "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz",
+      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE="
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+    },
+    "array-equal": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz",
+      "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw=="
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "^1.0.1"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.nlark.com/array-uniq/download/array-uniq-1.0.3.tgz?cache=0&sync_timestamp=1620042045402&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farray-uniq%2Fdownload%2Farray-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+    },
+    "arraybuffer.slice": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+      "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz",
+      "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=",
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "asn1.js": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-5.4.1.tgz",
+      "integrity": "sha1-EamAuE67kXgc41sP3C7ilON4Pwc=",
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "safer-buffer": "^2.1.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz",
+          "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og="
+        }
+      }
+    },
+    "assert": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz",
+      "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=",
+      "requires": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.nlark.com/util/download/util-0.10.3.tgz?cache=0&sync_timestamp=1622212943994&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil%2Fdownload%2Futil-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+    },
+    "ast-types": {
+      "version": "0.16.1",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
+      "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
+      "dev": true,
+      "requires": {
+        "tslib": "^2.0.1"
+      }
+    },
+    "astral-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "dev": true
+    },
+    "async": {
+      "version": "2.6.3",
+      "resolved": "https://registry.nlark.com/async/download/async-2.6.3.tgz?cache=0&sync_timestamp=1628206303171&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fasync%2Fdownload%2Fasync-2.6.3.tgz",
+      "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=",
+      "requires": {
+        "lodash": "^4.17.14"
+      }
+    },
+    "async-each": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz",
+      "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8="
+    },
+    "async-foreach": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+      "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA=="
+    },
+    "async-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz",
+      "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+    },
+    "at-least-node": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+      "dev": true,
+      "optional": true
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz",
+      "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k="
+    },
+    "autoprefixer": {
+      "version": "9.8.6",
+      "resolved": "https://registry.nlark.com/autoprefixer/download/autoprefixer-9.8.6.tgz?cache=0&sync_timestamp=1630618912073&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fautoprefixer%2Fdownload%2Fautoprefixer-9.8.6.tgz",
+      "integrity": "sha1-O3NZTKG/kmYyDFrPFYjXTep0IQ8=",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.12.0",
+        "caniuse-lite": "^1.0.30001109",
+        "colorette": "^1.2.1",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.32",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz",
+          "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=",
+          "dev": true
+        }
+      }
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+    },
+    "aws4": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.11.0.tgz?cache=0&sync_timestamp=1604101244098&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws4%2Fdownload%2Faws4-1.11.0.tgz",
+      "integrity": "sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk="
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.nlark.com/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1627646655305&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "js-tokens": {
+          "version": "3.0.2",
+          "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-3.0.2.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-3.0.2.tgz",
+          "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.nlark.com/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "babel-jest": {
+      "version": "25.5.1",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz",
+      "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==",
+      "dev": true,
+      "requires": {
+        "@jest/transform": "^25.5.1",
+        "@jest/types": "^25.5.0",
+        "@types/babel__core": "^7.1.7",
+        "babel-plugin-istanbul": "^6.0.0",
+        "babel-preset-jest": "^25.5.0",
+        "chalk": "^3.0.0",
+        "graceful-fs": "^4.2.4",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "babel-loader": {
+      "version": "8.2.2",
+      "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.2.2.tgz?cache=0&sync_timestamp=1606489470588&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-loader%2Fdownload%2Fbabel-loader-8.2.2.tgz",
+      "integrity": "sha1-k2POhMEMmkDmx1N0jhRBtgyKC4E=",
+      "requires": {
+        "find-cache-dir": "^3.3.1",
+        "loader-utils": "^1.4.0",
+        "make-dir": "^3.1.0",
+        "schema-utils": "^2.6.5"
+      },
+      "dependencies": {
+        "find-cache-dir": {
+          "version": "3.3.2",
+          "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-3.3.2.tgz?cache=0&sync_timestamp=1630260035189&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-3.3.2.tgz",
+          "integrity": "sha1-swxbbv8HMHMa6pu9nb7L2AJW1ks=",
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^3.0.2",
+            "pkg-dir": "^4.1.0"
+          }
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.nlark.com/find-up/download/find-up-4.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz",
+          "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.nlark.com/locate-path/download/locate-path-5.0.0.tgz",
+          "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=",
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz",
+          "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=",
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.nlark.com/p-locate/download/p-locate-4.1.0.tgz?cache=0&sync_timestamp=1629892708584&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-4.1.0.tgz",
+          "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=",
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.nlark.com/path-exists/download/path-exists-4.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-4.0.0.tgz",
+          "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM="
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602858957553&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz",
+          "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=",
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        },
+        "schema-utils": {
+          "version": "2.7.1",
+          "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-2.7.1.tgz",
+          "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=",
+          "requires": {
+            "@types/json-schema": "^7.0.5",
+            "ajv": "^6.12.4",
+            "ajv-keywords": "^3.5.2"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
+        }
+      }
+    },
+    "babel-plugin-dynamic-import-node": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz",
+      "integrity": "sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=",
+      "requires": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "babel-plugin-import": {
+      "version": "1.13.8",
+      "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.8.tgz",
+      "integrity": "sha512-36babpjra5m3gca44V6tSTomeBlPA7cHUynrE2WiQIm3rEGD9xy28MKsx5IdO45EbnpJY7Jrgd00C6Dwt/l/2Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0"
+      }
+    },
+    "babel-plugin-istanbul": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+      "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@istanbuljs/load-nyc-config": "^1.0.0",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-instrument": "^5.0.4",
+        "test-exclude": "^6.0.0"
+      },
+      "dependencies": {
+        "istanbul-lib-instrument": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+          "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+          "dev": true,
+          "requires": {
+            "@babel/core": "^7.12.3",
+            "@babel/parser": "^7.14.7",
+            "@istanbuljs/schema": "^0.1.2",
+            "istanbul-lib-coverage": "^3.2.0",
+            "semver": "^6.3.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+          "dev": true
+        }
+      }
+    },
+    "babel-plugin-jest-hoist": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz",
+      "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.3.3",
+        "@babel/types": "^7.3.3",
+        "@types/babel__traverse": "^7.0.6"
+      }
+    },
+    "babel-plugin-polyfill-corejs2": {
+      "version": "0.2.2",
+      "resolved": "https://registry.nlark.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.2.2.tgz?cache=0&sync_timestamp=1622023848590&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-polyfill-corejs2%2Fdownload%2Fbabel-plugin-polyfill-corejs2-0.2.2.tgz",
+      "integrity": "sha1-6RJHheb9lPlLYYp5VOVpMFO/Uyc=",
+      "requires": {
+        "@babel/compat-data": "^7.13.11",
+        "@babel/helper-define-polyfill-provider": "^0.2.2",
+        "semver": "^6.1.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
+        }
+      }
+    },
+    "babel-plugin-polyfill-corejs3": {
+      "version": "0.2.4",
+      "resolved": "https://registry.nlark.com/babel-plugin-polyfill-corejs3/download/babel-plugin-polyfill-corejs3-0.2.4.tgz",
+      "integrity": "sha1-aMuBMWsOjZ1yGpLgAJ7G7NTNLKk=",
+      "requires": {
+        "@babel/helper-define-polyfill-provider": "^0.2.2",
+        "core-js-compat": "^3.14.0"
+      }
+    },
+    "babel-plugin-polyfill-regenerator": {
+      "version": "0.2.2",
+      "resolved": "https://registry.nlark.com/babel-plugin-polyfill-regenerator/download/babel-plugin-polyfill-regenerator-0.2.2.tgz",
+      "integrity": "sha1-sxDI1kKsraNIwfo7Pmzg6FG+4Hc=",
+      "requires": {
+        "@babel/helper-define-polyfill-provider": "^0.2.2"
+      }
+    },
+    "babel-preset-current-node-syntax": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz",
+      "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-bigint": "^7.8.3",
+        "@babel/plugin-syntax-class-properties": "^7.8.3",
+        "@babel/plugin-syntax-import-meta": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      }
+    },
+    "babel-preset-jest": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz",
+      "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-jest-hoist": "^25.5.0",
+        "babel-preset-current-node-syntax": "^0.1.2"
+      }
+    },
+    "backo2": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+      "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA=="
+    },
+    "balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&sync_timestamp=1617714298273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz",
+      "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4="
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz",
+      "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "base-64": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz",
+      "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="
+    },
+    "base64-arraybuffer": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
+      "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ=="
+    },
+    "base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.5.1.tgz",
+      "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo="
+    },
+    "base64id": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "bfj": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npm.taobao.org/bfj/download/bfj-6.1.2.tgz",
+      "integrity": "sha1-MlyGGoIryzWKQceKM7jm4ght3n8=",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.5",
+        "check-types": "^8.0.3",
+        "hoopy": "^0.1.4",
+        "tryer": "^1.0.1"
+      }
+    },
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.nlark.com/big.js/download/big.js-5.2.2.tgz",
+      "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg="
+    },
+    "binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.2.0.tgz?cache=0&sync_timestamp=1610299322955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.2.0.tgz",
+      "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0="
+    },
+    "bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz",
+      "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=",
+      "optional": true,
+      "requires": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "blob": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
+      "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
+    },
+    "block-stream": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+      "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==",
+      "requires": {
+        "inherits": "~2.0.0"
+      }
+    },
+    "bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz?cache=0&sync_timestamp=1602657218976&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbluebird%2Fdownload%2Fbluebird-3.7.2.tgz",
+      "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28="
+    },
+    "bmp-js": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
+      "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.2.0.tgz",
+      "integrity": "sha1-NYhgZ0OWxpl3canQUfzBtX1K4AI="
+    },
+    "body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz",
+      "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "on-finished": "~2.3.0",
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz?cache=0&sync_timestamp=1616385328325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.7.0.tgz",
+          "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=",
+          "dev": true
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "requires": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz",
+          "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=",
+          "dev": true
+        }
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1614010785257&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz",
+      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz",
+      "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+    },
+    "browser-process-hrtime": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+      "dev": true
+    },
+    "browser-resolve": {
+      "version": "1.11.3",
+      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+      "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
+      "dev": true,
+      "requires": {
+        "resolve": "1.1.7"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.1.7",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+          "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==",
+          "dev": true
+        }
+      }
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz",
+      "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=",
+      "requires": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=",
+      "requires": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz",
+      "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=",
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.1.0.tgz?cache=0&sync_timestamp=1605194257215&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserify-rsa%2Fdownload%2Fbrowserify-rsa-4.1.0.tgz",
+      "integrity": "sha1-sv0Gtbda4pf3zi3GUfkY9b4VjI0=",
+      "requires": {
+        "bn.js": "^5.0.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.2.1.tgz?cache=0&sync_timestamp=1596557809886&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserify-sign%2Fdownload%2Fbrowserify-sign-4.2.1.tgz",
+      "integrity": "sha1-6vSt1G3VS+O7OzbAzxWrvrp5VsM=",
+      "requires": {
+        "bn.js": "^5.1.1",
+        "browserify-rsa": "^4.0.1",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.3",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.5",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz",
+          "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz",
+          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY="
+        }
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
+      "requires": {
+        "pako": "~1.0.5"
+      }
+    },
+    "browserslist": {
+      "version": "4.17.0",
+      "resolved": "https://registry.nlark.com/browserslist/download/browserslist-4.17.0.tgz?cache=0&sync_timestamp=1630836528153&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.17.0.tgz",
+      "integrity": "sha1-H82B7HW0HW1JlPsIMbkqwYwBZJw=",
+      "requires": {
+        "caniuse-lite": "^1.0.30001254",
+        "colorette": "^1.3.0",
+        "electron-to-chromium": "^1.3.830",
+        "escalade": "^3.1.1",
+        "node-releases": "^1.1.75"
+      }
+    },
+    "bser": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+      "dev": true,
+      "requires": {
+        "node-int64": "^0.4.0"
+      }
+    },
+    "buffer": {
+      "version": "4.9.2",
+      "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.2.tgz?cache=0&sync_timestamp=1606098175437&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbuffer%2Fdownload%2Fbuffer-4.9.2.tgz",
+      "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=",
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "buffer-equal": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
+      "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
+      "dev": true
+    },
+    "buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.nlark.com/buffer-from/download/buffer-from-1.1.2.tgz?cache=0&sync_timestamp=1627578710888&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbuffer-from%2Fdownload%2Fbuffer-from-1.1.2.tgz",
+      "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U="
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=",
+      "dev": true
+    },
+    "buffer-json": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/buffer-json/download/buffer-json-2.0.0.tgz",
+      "integrity": "sha1-9z4TseQvGW/i/WfQAcfXEH7dfCM=",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
+    },
+    "bytes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz",
+      "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY="
+    },
+    "cacache": {
+      "version": "12.0.4",
+      "resolved": "https://registry.nlark.com/cacache/download/cacache-12.0.4.tgz",
+      "integrity": "sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw=",
+      "requires": {
+        "bluebird": "^3.5.5",
+        "chownr": "^1.1.1",
+        "figgy-pudding": "^3.5.1",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.1.15",
+        "infer-owner": "^1.0.3",
+        "lru-cache": "^5.1.1",
+        "mississippi": "^3.0.0",
+        "mkdirp": "^0.5.1",
+        "move-concurrently": "^1.0.1",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^2.6.3",
+        "ssri": "^6.0.1",
+        "unique-filename": "^1.1.1",
+        "y18n": "^4.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
+          "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        }
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz",
+      "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      }
+    },
+    "cache-content-type": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz",
+      "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==",
+      "requires": {
+        "mime-types": "^2.1.18",
+        "ylru": "^1.2.0"
+      }
+    },
+    "cache-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/cache-loader/download/cache-loader-4.1.0.tgz",
+      "integrity": "sha1-mUjK41OuwKH8ser9ojAIFuyFOH4=",
+      "dev": true,
+      "requires": {
+        "buffer-json": "^2.0.0",
+        "find-cache-dir": "^3.0.0",
+        "loader-utils": "^1.2.3",
+        "mkdirp": "^0.5.1",
+        "neo-async": "^2.6.1",
+        "schema-utils": "^2.0.0"
+      },
+      "dependencies": {
+        "find-cache-dir": {
+          "version": "3.3.2",
+          "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-3.3.2.tgz?cache=0&sync_timestamp=1630260035189&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-3.3.2.tgz",
+          "integrity": "sha1-swxbbv8HMHMa6pu9nb7L2AJW1ks=",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^3.0.2",
+            "pkg-dir": "^4.1.0"
+          }
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.nlark.com/find-up/download/find-up-4.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz",
+          "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.nlark.com/locate-path/download/locate-path-5.0.0.tgz",
+          "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz",
+          "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.nlark.com/p-locate/download/p-locate-4.1.0.tgz?cache=0&sync_timestamp=1629892708584&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-4.1.0.tgz",
+          "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.nlark.com/path-exists/download/path-exists-4.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-4.0.0.tgz",
+          "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602858957553&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz",
+          "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        },
+        "schema-utils": {
+          "version": "2.7.1",
+          "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-2.7.1.tgz",
+          "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.5",
+            "ajv": "^6.12.4",
+            "ajv-keywords": "^3.5.2"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
+      }
+    },
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/call-bind/download/call-bind-1.0.2.tgz?cache=0&sync_timestamp=1610403007655&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcall-bind%2Fdownload%2Fcall-bind-1.0.2.tgz",
+      "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "call-me-maybe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz",
+      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+      "dev": true
+    },
+    "caller-callsite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz",
+      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+      "dev": true,
+      "requires": {
+        "callsites": "^2.0.0"
+      }
+    },
+    "caller-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz",
+      "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+      "dev": true,
+      "requires": {
+        "caller-callsite": "^2.0.0"
+      }
+    },
+    "callsites": {
+      "version": "2.0.0",
+      "resolved": "https://registry.nlark.com/callsites/download/callsites-2.0.0.tgz",
+      "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+      "dev": true
+    },
+    "camel-case": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz?cache=0&sync_timestamp=1606867311564&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-3.0.0.tgz",
+      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+      "dev": true,
+      "requires": {
+        "no-case": "^2.2.0",
+        "upper-case": "^1.1.1"
+      }
+    },
+    "camelcase": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-6.2.0.tgz?cache=0&sync_timestamp=1603921799543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-6.2.0.tgz",
+      "integrity": "sha1-kkr4gcnVJaydh/QNlk5c6pgqGAk=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==",
+      "requires": {
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+          "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw=="
+        }
+      }
+    },
+    "caniuse-api": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz",
+      "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-lite": "^1.0.0",
+        "lodash.memoize": "^4.1.2",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001255",
+      "resolved": "https://registry.nlark.com/caniuse-lite/download/caniuse-lite-1.0.30001255.tgz",
+      "integrity": "sha1-87CbWatS4551GlaVI2GPR8QpjKA="
+    },
+    "capture-exit": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
+      "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
+      "dev": true,
+      "requires": {
+        "rsvp": "^4.8.4"
+      }
+    },
+    "case-sensitive-paths-webpack-plugin": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.4.0.tgz?cache=0&sync_timestamp=1614018570698&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcase-sensitive-paths-webpack-plugin%2Fdownload%2Fcase-sensitive-paths-webpack-plugin-2.4.0.tgz",
+      "integrity": "sha1-22QGbGQi7tLgjMFLmGykN5bbxtQ=",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1627646655305&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
+      "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "dependencies": {
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="
+    },
+    "check-types": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npm.taobao.org/check-types/download/check-types-8.0.3.tgz",
+      "integrity": "sha1-M1bMoZyIlUTy16le1JzlCKDs9VI=",
+      "dev": true
+    },
+    "chokidar": {
+      "version": "3.5.2",
+      "resolved": "https://registry.nlark.com/chokidar/download/chokidar-3.5.2.tgz",
+      "integrity": "sha1-26OXb8rbAW9m/TZQIdkWANAcHnU=",
+      "requires": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz",
+          "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz",
+          "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.nlark.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1626760200164&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz",
+          "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=",
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz",
+          "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss="
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz",
+          "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz",
+      "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs="
+    },
+    "chrome-simple-launcher": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/chrome-simple-launcher/-/chrome-simple-launcher-0.1.3.tgz",
+      "integrity": "sha512-8xUtp6cS4tn1o1Pzev6pxbgF7vCRdfxFLW4xOSUIF/83+ya8GWRqMpkqd8h7VDliHLhyRIi5zKbi85wpZ4m2oA=="
+    },
+    "chrome-trace-event": {
+      "version": "1.0.3",
+      "resolved": "https://registry.nlark.com/chrome-trace-event/download/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw="
+    },
+    "ci-info": {
+      "version": "1.6.0",
+      "resolved": "https://registry.nlark.com/ci-info/download/ci-info-1.6.0.tgz",
+      "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=",
+      "dev": true
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz",
+      "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz",
+      "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "clean-css": {
+      "version": "4.2.3",
+      "resolved": "https://registry.nlark.com/clean-css/download/clean-css-4.2.3.tgz",
+      "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=",
+      "dev": true,
+      "requires": {
+        "source-map": "~0.6.0"
+      }
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/cli-cursor/download/cli-cursor-2.1.0.tgz?cache=0&sync_timestamp=1629747358529&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcli-cursor%2Fdownload%2Fcli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^2.0.0"
+      }
+    },
+    "cli-highlight": {
+      "version": "2.1.11",
+      "resolved": "https://registry.npm.taobao.org/cli-highlight/download/cli-highlight-2.1.11.tgz",
+      "integrity": "sha1-SXNvpFLwqvT65YDjCssmgo0twb8=",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0",
+        "highlight.js": "^10.7.1",
+        "mz": "^2.4.0",
+        "parse5": "^5.1.1",
+        "parse5-htmlparser2-tree-adapter": "^6.0.0",
+        "yargs": "^16.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz",
+          "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646655305&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz",
+          "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+          "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+          "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz",
+          "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
+          "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "cli-spinners": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npm.taobao.org/cli-spinners/download/cli-spinners-2.6.0.tgz?cache=0&sync_timestamp=1616091482312&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-spinners%2Fdownload%2Fcli-spinners-2.6.0.tgz",
+      "integrity": "sha1-NsfcmPtqmna9YjjsP3fiQlYn6Tk=",
+      "dev": true
+    },
+    "clipboardy": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npm.taobao.org/clipboardy/download/clipboardy-2.3.0.tgz",
+      "integrity": "sha1-PCkDZQxo5GqRs4iYW8J3QofbopA=",
+      "dev": true,
+      "requires": {
+        "arch": "^2.1.1",
+        "execa": "^1.0.0",
+        "is-wsl": "^2.1.1"
+      },
+      "dependencies": {
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-2.2.0.tgz",
+          "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        }
+      }
+    },
+    "cliui": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-6.0.0.tgz?cache=0&sync_timestamp=1604880017635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-6.0.0.tgz",
+      "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=",
+      "requires": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^6.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz",
+          "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+          "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+          "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0="
+        },
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.2.tgz?cache=0&sync_timestamp=1618558856477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-4.2.2.tgz",
+          "integrity": "sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU=",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz?cache=0&sync_timestamp=1618558923406&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-6.2.0.tgz",
+          "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        }
+      }
+    },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+      "dev": true
+    },
+    "clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/clone-deep/download/clone-deep-4.0.1.tgz",
+      "integrity": "sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c=",
+      "requires": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      }
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+    },
+    "co-body": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz",
+      "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==",
+      "requires": {
+        "inflation": "^2.0.0",
+        "qs": "^6.5.2",
+        "raw-body": "^2.3.3",
+        "type-is": "^1.6.16"
+      }
+    },
+    "coa": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz",
+      "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=",
+      "dev": true,
+      "requires": {
+        "@types/q": "^1.5.1",
+        "chalk": "^2.4.1",
+        "q": "^1.1.2"
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="
+    },
+    "collect-v8-coverage": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+      "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+      "dev": true
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color": {
+      "version": "3.2.1",
+      "resolved": "https://registry.nlark.com/color/download/color-3.2.1.tgz",
+      "integrity": "sha1-NUTcGYyvRJDD7MmnkLVP6f9F4WQ=",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.3",
+        "color-string": "^1.6.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz",
+      "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+    },
+    "color-string": {
+      "version": "1.6.0",
+      "resolved": "https://registry.nlark.com/color-string/download/color-string-1.6.0.tgz",
+      "integrity": "sha1-w5FfYf4mdnLLfh4GTJ1pIhn2wxI=",
+      "dev": true,
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "colorette": {
+      "version": "1.3.0",
+      "resolved": "https://registry.nlark.com/colorette/download/colorette-1.3.0.tgz?cache=0&sync_timestamp=1628600300224&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcolorette%2Fdownload%2Fcolorette-1.3.0.tgz",
+      "integrity": "sha1-/0XS8O2yRAadO3cq3rBP7TjQoK8="
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz",
+      "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=",
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.nlark.com/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1627358254258&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz",
+      "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM="
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+    },
+    "component-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+      "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw=="
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz",
+      "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A="
+    },
+    "component-inherit": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+      "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA=="
+    },
+    "compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz",
+      "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=",
+      "dev": true,
+      "requires": {
+        "mime-db": ">= 1.43.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz",
+      "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz",
+          "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+          "dev": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz",
+      "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=",
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz",
+      "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY="
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
+    },
+    "consolidate": {
+      "version": "0.15.1",
+      "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz",
+      "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=",
+      "requires": {
+        "bluebird": "^3.1.1"
+      }
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+    },
+    "content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz",
+      "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=",
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz",
+      "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js="
+    },
+    "convert-source-map": {
+      "version": "1.8.0",
+      "resolved": "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.8.0.tgz",
+      "integrity": "sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k=",
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
+    "cookie": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz",
+      "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "cookies": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz",
+      "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==",
+      "requires": {
+        "depd": "~2.0.0",
+        "keygrip": "~1.1.0"
+      },
+      "dependencies": {
+        "depd": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+          "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+        }
+      }
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=",
+      "requires": {
+        "aproba": "^1.1.1",
+        "fs-write-stream-atomic": "^1.0.8",
+        "iferr": "^0.1.5",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.0"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+    },
+    "copy-to": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz",
+      "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w=="
+    },
+    "copy-webpack-plugin": {
+      "version": "5.1.2",
+      "resolved": "https://registry.nlark.com/copy-webpack-plugin/download/copy-webpack-plugin-5.1.2.tgz?cache=0&sync_timestamp=1624628458516&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcopy-webpack-plugin%2Fdownload%2Fcopy-webpack-plugin-5.1.2.tgz",
+      "integrity": "sha1-ioieHcr6bJHGzUvhrRWPHTgjuuI=",
+      "dev": true,
+      "requires": {
+        "cacache": "^12.0.3",
+        "find-cache-dir": "^2.1.0",
+        "glob-parent": "^3.1.0",
+        "globby": "^7.1.1",
+        "is-glob": "^4.0.1",
+        "loader-utils": "^1.2.3",
+        "minimatch": "^3.0.4",
+        "normalize-path": "^3.0.0",
+        "p-limit": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^4.0.0",
+        "webpack-log": "^2.0.0"
+      }
+    },
+    "core-js": {
+      "version": "3.17.2",
+      "resolved": "https://registry.nlark.com/core-js/download/core-js-3.17.2.tgz",
+      "integrity": "sha1-+WDq5xDcYsKcypPVMy42YOKJ2xA="
+    },
+    "core-js-compat": {
+      "version": "3.17.2",
+      "resolved": "https://registry.nlark.com/core-js-compat/download/core-js-compat-3.17.2.tgz?cache=0&sync_timestamp=1630603307523&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcore-js-compat%2Fdownload%2Fcore-js-compat-3.17.2.tgz",
+      "integrity": "sha1-9GGrlQwKD/7fwyfevyi35RiVCTY=",
+      "requires": {
+        "browserslist": "^4.16.8",
+        "semver": "7.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.0.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.0.0.tgz",
+          "integrity": "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44="
+        }
+      }
+    },
+    "core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz?cache=0&sync_timestamp=1630420577662&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcore-util-is%2Fdownload%2Fcore-util-is-1.0.3.tgz",
+      "integrity": "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U="
+    },
+    "cosmiconfig": {
+      "version": "5.2.1",
+      "resolved": "https://registry.nlark.com/cosmiconfig/download/cosmiconfig-5.2.1.tgz?cache=0&sync_timestamp=1629602330801&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-5.2.1.tgz",
+      "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=",
+      "dev": true,
+      "requires": {
+        "import-fresh": "^2.0.0",
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.13.1",
+        "parse-json": "^4.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1610966667117&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        }
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.4.tgz",
+      "integrity": "sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4=",
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.5.3"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz",
+          "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og="
+        }
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz",
+      "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=",
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz",
+      "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=",
+      "requires": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "cross-env": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+      "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.1"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "cross-spawn": {
+      "version": "6.0.5",
+      "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz",
+      "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=",
+      "dev": true,
+      "requires": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
+    },
+    "crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
+      "requires": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      }
+    },
+    "css": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npm.taobao.org/css/download/css-2.2.4.tgz",
+      "integrity": "sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk=",
+      "requires": {
+        "inherits": "^2.0.3",
+        "source-map": "^0.6.1",
+        "source-map-resolve": "^0.5.2",
+        "urix": "^0.1.0"
+      }
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+      "dev": true
+    },
+    "css-declaration-sorter": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz",
+      "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "timsort": "^0.3.0"
+      }
+    },
+    "css-loader": {
+      "version": "3.6.0",
+      "resolved": "https://registry.nlark.com/css-loader/download/css-loader-3.6.0.tgz?cache=0&sync_timestamp=1626725891008&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-loader%2Fdownload%2Fcss-loader-3.6.0.tgz",
+      "integrity": "sha1-Lkssfm4tJ/jI8o9hv/zS5ske9kU=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "cssesc": "^3.0.0",
+        "icss-utils": "^4.1.1",
+        "loader-utils": "^1.2.3",
+        "normalize-path": "^3.0.0",
+        "postcss": "^7.0.32",
+        "postcss-modules-extract-imports": "^2.0.0",
+        "postcss-modules-local-by-default": "^3.0.2",
+        "postcss-modules-scope": "^2.2.0",
+        "postcss-modules-values": "^3.0.0",
+        "postcss-value-parser": "^4.1.0",
+        "schema-utils": "^2.7.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1603921799543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz",
+          "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+          "dev": true
+        },
+        "cssesc": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz",
+          "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=",
+          "dev": true
+        },
+        "postcss-value-parser": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz",
+          "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=",
+          "dev": true
+        },
+        "schema-utils": {
+          "version": "2.7.1",
+          "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-2.7.1.tgz",
+          "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.5",
+            "ajv": "^6.12.4",
+            "ajv-keywords": "^3.5.2"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        }
+      }
+    },
+    "css-select": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/css-select/download/css-select-2.1.0.tgz",
+      "integrity": "sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8=",
+      "dev": true,
+      "requires": {
+        "boolbase": "^1.0.0",
+        "css-what": "^3.2.1",
+        "domutils": "^1.7.0",
+        "nth-check": "^1.0.2"
+      }
+    },
+    "css-select-base-adapter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz",
+      "integrity": "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc=",
+      "dev": true
+    },
+    "css-tree": {
+      "version": "1.0.0-alpha.37",
+      "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.37.tgz",
+      "integrity": "sha1-mL69YsTB2flg7DQM+fdSLjBwmiI=",
+      "dev": true,
+      "requires": {
+        "mdn-data": "2.0.4",
+        "source-map": "^0.6.1"
+      }
+    },
+    "css-what": {
+      "version": "3.4.2",
+      "resolved": "https://registry.nlark.com/css-what/download/css-what-3.4.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-what%2Fdownload%2Fcss-what-3.4.2.tgz",
+      "integrity": "sha1-6nAm/LAXd+295SEk4h8yfnrpUOQ=",
+      "dev": true
+    },
+    "cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+    },
+    "cssnano": {
+      "version": "4.1.11",
+      "resolved": "https://registry.nlark.com/cssnano/download/cssnano-4.1.11.tgz",
+      "integrity": "sha1-x7X1uB2iacsf2YLLlgwSAJEMmpk=",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "cssnano-preset-default": "^4.0.8",
+        "is-resolvable": "^1.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "cssnano-preset-default": {
+      "version": "4.0.8",
+      "resolved": "https://registry.nlark.com/cssnano-preset-default/download/cssnano-preset-default-4.0.8.tgz?cache=0&sync_timestamp=1629280558765&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcssnano-preset-default%2Fdownload%2Fcssnano-preset-default-4.0.8.tgz",
+      "integrity": "sha1-kgYisfwelaNOiDggPxOXpQTy0/8=",
+      "dev": true,
+      "requires": {
+        "css-declaration-sorter": "^4.0.1",
+        "cssnano-util-raw-cache": "^4.0.1",
+        "postcss": "^7.0.0",
+        "postcss-calc": "^7.0.1",
+        "postcss-colormin": "^4.0.3",
+        "postcss-convert-values": "^4.0.1",
+        "postcss-discard-comments": "^4.0.2",
+        "postcss-discard-duplicates": "^4.0.2",
+        "postcss-discard-empty": "^4.0.1",
+        "postcss-discard-overridden": "^4.0.1",
+        "postcss-merge-longhand": "^4.0.11",
+        "postcss-merge-rules": "^4.0.3",
+        "postcss-minify-font-values": "^4.0.2",
+        "postcss-minify-gradients": "^4.0.2",
+        "postcss-minify-params": "^4.0.2",
+        "postcss-minify-selectors": "^4.0.2",
+        "postcss-normalize-charset": "^4.0.1",
+        "postcss-normalize-display-values": "^4.0.2",
+        "postcss-normalize-positions": "^4.0.2",
+        "postcss-normalize-repeat-style": "^4.0.2",
+        "postcss-normalize-string": "^4.0.2",
+        "postcss-normalize-timing-functions": "^4.0.2",
+        "postcss-normalize-unicode": "^4.0.1",
+        "postcss-normalize-url": "^4.0.1",
+        "postcss-normalize-whitespace": "^4.0.2",
+        "postcss-ordered-values": "^4.1.2",
+        "postcss-reduce-initial": "^4.0.3",
+        "postcss-reduce-transforms": "^4.0.2",
+        "postcss-svgo": "^4.0.3",
+        "postcss-unique-selectors": "^4.0.1"
+      }
+    },
+    "cssnano-util-get-arguments": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz",
+      "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
+      "dev": true
+    },
+    "cssnano-util-get-match": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz",
+      "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
+      "dev": true
+    },
+    "cssnano-util-raw-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz",
+      "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M=",
+      "dev": true
+    },
+    "csso": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npm.taobao.org/csso/download/csso-4.2.0.tgz",
+      "integrity": "sha1-6jpWE0bo3J9UbW/r7dUBh884lSk=",
+      "dev": true,
+      "requires": {
+        "css-tree": "^1.1.2"
+      },
+      "dependencies": {
+        "css-tree": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.1.3.tgz",
+          "integrity": "sha1-60hw+2/XcHMn7JXC/yqwm16NuR0=",
+          "dev": true,
+          "requires": {
+            "mdn-data": "2.0.14",
+            "source-map": "^0.6.1"
+          }
+        },
+        "mdn-data": {
+          "version": "2.0.14",
+          "resolved": "https://registry.nlark.com/mdn-data/download/mdn-data-2.0.14.tgz",
+          "integrity": "sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA=",
+          "dev": true
+        }
+      }
+    },
+    "cssom": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+      "dev": true
+    },
+    "cssstyle": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+      "dev": true,
+      "requires": {
+        "cssom": "~0.3.6"
+      },
+      "dependencies": {
+        "cssom": {
+          "version": "0.3.8",
+          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+          "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+          "dev": true
+        }
+      }
+    },
+    "csstype": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.0.tgz",
+      "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==",
+      "requires": {
+        "array-find-index": "^1.0.1"
+      }
+    },
+    "cyclist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz",
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "data-urls": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
+      "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.0",
+        "whatwg-mimetype": "^2.2.0",
+        "whatwg-url": "^7.0.0"
+      }
+    },
+    "dayjs": {
+      "version": "1.11.9",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz",
+      "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA=="
+    },
+    "de-indent": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz",
+      "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0="
+    },
+    "debug": {
+      "version": "4.3.2",
+      "resolved": "https://registry.nlark.com/debug/download/debug-4.3.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz",
+      "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=",
+      "requires": {
+        "ms": "2.1.2"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1610348670939&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+    },
+    "deep-equal": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz?cache=0&sync_timestamp=1606860101281&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeep-equal%2Fdownload%2Fdeep-equal-1.1.1.tgz",
+      "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=",
+      "dev": true,
+      "requires": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      }
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.nlark.com/deep-is/download/deep-is-0.1.4.tgz?cache=0&sync_timestamp=1630774538962&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdeep-is%2Fdownload%2Fdeep-is-0.1.4.tgz",
+      "integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE="
+    },
+    "deepmerge": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz?cache=0&sync_timestamp=1606805746825&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeepmerge%2Fdownload%2Fdeepmerge-1.5.2.tgz",
+      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=",
+      "dev": true
+    },
+    "default-gateway": {
+      "version": "5.0.5",
+      "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-5.0.5.tgz?cache=0&sync_timestamp=1610365816953&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdefault-gateway%2Fdownload%2Fdefault-gateway-5.0.5.tgz",
+      "integrity": "sha1-T9a9XShV05s0zFpZUFSG6ar8mxA=",
+      "dev": true,
+      "requires": {
+        "execa": "^3.3.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz",
+          "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "execa": {
+          "version": "3.4.0",
+          "resolved": "https://registry.nlark.com/execa/download/execa-3.4.0.tgz",
+          "integrity": "sha1-wI7UVQ72XYWPrCaf/IVyRG8364k=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "p-finally": "^2.0.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-5.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-5.2.0.tgz",
+          "integrity": "sha1-SWaheV7lrOZecGxLe+txJX1uItM=",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-stream": {
+          "version": "2.0.1",
+          "resolved": "https://registry.nlark.com/is-stream/download/is-stream-2.0.1.tgz",
+          "integrity": "sha1-+sHj1TuXrVqdCunO8jifWBClwHc=",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz?cache=0&sync_timestamp=1617823824094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-2.1.0.tgz",
+          "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-4.0.1.tgz",
+          "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz?cache=0&sync_timestamp=1617889786861&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-5.1.2.tgz",
+          "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "p-finally": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-2.0.1.tgz",
+          "integrity": "sha1-vW/KqcVZoJa2gIBvTWV7Pw8kBWE=",
+          "dev": true
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz?cache=0&sync_timestamp=1617971691339&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-3.1.1.tgz",
+          "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz",
+          "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz?cache=0&sync_timestamp=1628896304371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-3.0.0.tgz",
+          "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz",
+          "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "defaults": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz",
+      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.2"
+      }
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz",
+      "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=",
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz",
+      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "del": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz",
+      "integrity": "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ=",
+      "dev": true,
+      "requires": {
+        "@types/glob": "^7.1.1",
+        "globby": "^6.1.0",
+        "is-path-cwd": "^2.0.0",
+        "is-path-in-cwd": "^2.0.0",
+        "p-map": "^2.0.0",
+        "pify": "^4.0.1",
+        "rimraf": "^2.6.3"
+      },
+      "dependencies": {
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.nlark.com/globby/download/globby-6.1.0.tgz",
+          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+    },
+    "des.js": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz",
+      "integrity": "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM=",
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+    },
+    "detect-newline": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+      "dev": true
+    },
+    "detect-node": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/detect-node/download/detect-node-2.1.0.tgz",
+      "integrity": "sha1-yccHdaScPQO8LAbZpzvlUPl4+LE=",
+      "dev": true
+    },
+    "diff": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npm.taobao.org/diff/download/diff-4.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdiff%2Fdownload%2Fdiff-4.0.2.tgz",
+      "integrity": "sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0=",
+      "dev": true
+    },
+    "diff-sequences": {
+      "version": "25.2.6",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+      "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=",
+      "requires": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz",
+          "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og="
+        }
+      }
+    },
+    "dijkstrajs": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+      "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
+    },
+    "dir-glob": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz",
+      "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=",
+      "dev": true,
+      "requires": {
+        "path-type": "^3.0.0"
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "dev": true
+    },
+    "dns-packet": {
+      "version": "1.3.4",
+      "resolved": "https://registry.nlark.com/dns-packet/download/dns-packet-1.3.4.tgz",
+      "integrity": "sha1-40VQZYJKJQe6iGxVqJljuxB97G8=",
+      "dev": true,
+      "requires": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "dev": true,
+      "requires": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "dom-converter": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz",
+      "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=",
+      "dev": true,
+      "requires": {
+        "utila": "~0.4"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1621256858583&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz",
+      "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz",
+          "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=",
+          "dev": true
+        }
+      }
+    },
+    "dom-walk": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+      "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==",
+      "dev": true
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.nlark.com/domain-browser/download/domain-browser-1.2.0.tgz",
+      "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto="
+    },
+    "domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz",
+      "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=",
+      "dev": true
+    },
+    "domexception": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
+      "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
+      "dev": true,
+      "requires": {
+        "webidl-conversions": "^4.0.2"
+      }
+    },
+    "domhandler": {
+      "version": "4.2.2",
+      "resolved": "https://registry.nlark.com/domhandler/download/domhandler-4.2.2.tgz?cache=0&sync_timestamp=1630246778110&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomhandler%2Fdownload%2Fdomhandler-4.2.2.tgz",
+      "integrity": "sha1-6CXXIdGahrjCAaNSZOImxnjudV8=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.2.0"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz",
+          "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=",
+          "dev": true
+        }
+      }
+    },
+    "domutils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.nlark.com/domutils/download/domutils-1.7.0.tgz?cache=0&sync_timestamp=1630106535879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-1.7.0.tgz",
+      "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "dot-prop": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.3.0.tgz?cache=0&sync_timestamp=1605778235569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.3.0.tgz",
+      "integrity": "sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog=",
+      "dev": true,
+      "requires": {
+        "is-obj": "^2.0.0"
+      }
+    },
+    "dotenv": {
+      "version": "8.6.0",
+      "resolved": "https://registry.nlark.com/dotenv/download/dotenv-8.6.0.tgz?cache=0&sync_timestamp=1621633079842&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdotenv%2Fdownload%2Fdotenv-8.6.0.tgz",
+      "integrity": "sha1-Bhr2ZNGff02PxuT/m1hM4jety4s=",
+      "dev": true
+    },
+    "dotenv-expand": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-5.1.0.tgz",
+      "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=",
+      "dev": true
+    },
+    "duplexer": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.2.tgz",
+      "integrity": "sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY=",
+      "dev": true
+    },
+    "duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.nlark.com/duplexify/download/duplexify-3.7.1.tgz",
+      "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=",
+      "requires": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "easy-stack": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/easy-stack/download/easy-stack-1.0.1.tgz?cache=0&sync_timestamp=1605130346827&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feasy-stack%2Fdownload%2Feasy-stack-1.0.1.tgz",
+      "integrity": "sha1-iv5CZGJpiMq7EfPHBMzQyDVBEGY=",
+      "dev": true
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+    },
+    "ejs": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz",
+      "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.830",
+      "resolved": "https://registry.nlark.com/electron-to-chromium/download/electron-to-chromium-1.3.830.tgz?cache=0&sync_timestamp=1630706657610&other_urls=https%3A%2F%2Fregistry.nlark.com%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.830.tgz",
+      "integrity": "sha1-QOMUQgT4yhGyzr7IPPFMINNJkjY="
+    },
+    "elliptic": {
+      "version": "6.5.4",
+      "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.4.tgz?cache=0&sync_timestamp=1612290836352&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felliptic%2Fdownload%2Felliptic-6.5.4.tgz",
+      "integrity": "sha1-2jfOvTHnmhNn6UG1ku0fvr1Yq7s=",
+      "requires": {
+        "bn.js": "^4.11.9",
+        "brorand": "^1.1.0",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.1",
+        "inherits": "^2.0.4",
+        "minimalistic-assert": "^1.0.1",
+        "minimalistic-crypto-utils": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz",
+          "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og="
+        }
+      }
+    },
+    "emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1614682725186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz",
+      "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc="
+    },
+    "emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz",
+      "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang="
+    },
+    "encode-utf8": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
+      "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz",
+      "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=",
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "engine.io": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.6.1.tgz",
+      "integrity": "sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==",
+      "requires": {
+        "accepts": "~1.3.4",
+        "base64id": "2.0.0",
+        "cookie": "~0.4.1",
+        "debug": "~4.1.0",
+        "engine.io-parser": "~2.2.0",
+        "ws": "~7.4.2"
+      },
+      "dependencies": {
+        "cookie": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+          "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ws": {
+          "version": "7.4.6",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+          "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
+        }
+      }
+    },
+    "engine.io-client": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.3.tgz",
+      "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==",
+      "requires": {
+        "component-emitter": "~1.3.0",
+        "component-inherit": "0.0.3",
+        "debug": "~3.1.0",
+        "engine.io-parser": "~2.2.0",
+        "has-cors": "1.1.0",
+        "indexof": "0.0.1",
+        "parseqs": "0.0.6",
+        "parseuri": "0.0.6",
+        "ws": "~7.4.2",
+        "xmlhttprequest-ssl": "~1.6.2",
+        "yeast": "0.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        },
+        "ws": {
+          "version": "7.4.6",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+          "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
+        }
+      }
+    },
+    "engine.io-parser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz",
+      "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==",
+      "requires": {
+        "after": "0.8.2",
+        "arraybuffer.slice": "~0.0.7",
+        "base64-arraybuffer": "0.1.4",
+        "blob": "0.0.5",
+        "has-binary2": "~1.0.2"
+      },
+      "dependencies": {
+        "base64-arraybuffer": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
+          "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg=="
+        }
+      }
+    },
+    "enhanced-resolve": {
+      "version": "4.5.0",
+      "resolved": "https://registry.nlark.com/enhanced-resolve/download/enhanced-resolve-4.5.0.tgz?cache=0&sync_timestamp=1620663831689&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.5.0.tgz",
+      "integrity": "sha1-Lzz9hNvjtIfxjy2y7x4GSlccpew=",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.5.0",
+        "tapable": "^1.0.0"
+      },
+      "dependencies": {
+        "memory-fs": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.5.0.tgz",
+          "integrity": "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw=",
+          "requires": {
+            "errno": "^0.1.3",
+            "readable-stream": "^2.0.1"
+          }
+        }
+      }
+    },
+    "entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.nlark.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz",
+      "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=",
+      "dev": true
+    },
+    "envinfo": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-6.0.1.tgz",
+      "integrity": "sha512-IbMWvMQulMm1hiky1Zt5YTcSDEdZs0r9bt77mcLa4RUAKRYTGZvrb3MtAt47FuldPxwL+u2LtQex1FajIW1/Cw==",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.8.tgz",
+      "integrity": "sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8=",
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz",
+      "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "error-stack-parser": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npm.taobao.org/error-stack-parser/download/error-stack-parser-2.0.6.tgz",
+      "integrity": "sha1-WpmnB716TFinl5AtSNgoA+3mqtg=",
+      "dev": true,
+      "requires": {
+        "stackframe": "^1.1.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.18.5",
+      "resolved": "https://registry.nlark.com/es-abstract/download/es-abstract-1.18.5.tgz?cache=0&sync_timestamp=1627880509012&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fes-abstract%2Fdownload%2Fes-abstract-1.18.5.tgz",
+      "integrity": "sha1-mxDefUwgajWB/VshJCM+BNtJrhk=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.2",
+        "internal-slot": "^1.0.3",
+        "is-callable": "^1.2.3",
+        "is-negative-zero": "^2.0.1",
+        "is-regex": "^1.1.3",
+        "is-string": "^1.0.6",
+        "object-inspect": "^1.11.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.2",
+        "string.prototype.trimend": "^1.0.4",
+        "string.prototype.trimstart": "^1.0.4",
+        "unbox-primitive": "^1.0.1"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567261690&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz",
+      "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA="
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "escodegen": {
+      "version": "1.14.3",
+      "resolved": "https://registry.npm.taobao.org/escodegen/download/escodegen-1.14.3.tgz",
+      "integrity": "sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM=",
+      "requires": {
+        "esprima": "^4.0.1",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1",
+        "source-map": "~0.6.1"
+      }
+    },
+    "eslint-scope": {
+      "version": "4.0.3",
+      "resolved": "https://registry.nlark.com/eslint-scope/download/eslint-scope-4.0.3.tgz?cache=0&sync_timestamp=1627081984408&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-scope%2Fdownload%2Feslint-scope-4.0.3.tgz",
+      "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=",
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz",
+      "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE="
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz",
+      "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=",
+      "requires": {
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596642941915&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz",
+          "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA="
+        }
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596642941915&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz",
+      "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0="
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz",
+      "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q="
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "event-pubsub": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz?cache=0&sync_timestamp=1606361593712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fevent-pubsub%2Fdownload%2Fevent-pubsub-4.3.0.tgz",
+      "integrity": "sha1-9o2Ba8KfHsAsU53FjI3UDOcss24=",
+      "dev": true
+    },
+    "eventemitter3": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.7.tgz",
+      "integrity": "sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8=",
+      "dev": true
+    },
+    "events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npm.taobao.org/events/download/events-3.3.0.tgz",
+      "integrity": "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA="
+    },
+    "eventsource": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/eventsource/download/eventsource-1.1.0.tgz?cache=0&sync_timestamp=1616041716084&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feventsource%2Fdownload%2Feventsource-1.1.0.tgz",
+      "integrity": "sha1-AOjKfJIQnpSw3fMtrGd9hBAoz68=",
+      "dev": true,
+      "requires": {
+        "original": "^1.0.0"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
+      "requires": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "exec-sh": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz",
+      "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==",
+      "dev": true
+    },
+    "execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.nlark.com/execa/download/execa-1.0.0.tgz",
+      "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^6.0.0",
+        "get-stream": "^4.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      }
+    },
+    "exif-parser": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
+      "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==",
+      "dev": true
+    },
+    "exit": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+      "dev": true
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
+      }
+    },
+    "expect": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz",
+      "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "ansi-styles": "^4.0.0",
+        "jest-get-type": "^25.2.6",
+        "jest-matcher-utils": "^25.5.0",
+        "jest-message-util": "^25.5.0",
+        "jest-regex-util": "^25.2.6"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        }
+      }
+    },
+    "express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz?cache=0&sync_timestamp=1585189541025&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz",
+      "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz?cache=0&sync_timestamp=1616385328325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.7.0.tgz",
+          "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz",
+      "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo="
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz",
+      "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+      "requires": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU="
+    },
+    "fast-glob": {
+      "version": "2.2.7",
+      "resolved": "https://registry.nlark.com/fast-glob/download/fast-glob-2.2.7.tgz",
+      "integrity": "sha1-aVOFfDr6R1//ku5gFdUtpwpM050=",
+      "dev": true,
+      "requires": {
+        "@mrmlnc/readdir-enhanced": "^2.2.1",
+        "@nodelib/fs.stat": "^1.1.2",
+        "glob-parent": "^3.1.0",
+        "is-glob": "^4.0.0",
+        "merge2": "^1.2.3",
+        "micromatch": "^3.1.10"
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM="
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+    },
+    "fastq": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "faye-websocket": {
+      "version": "0.11.4",
+      "resolved": "https://registry.nlark.com/faye-websocket/download/faye-websocket-0.11.4.tgz?cache=0&sync_timestamp=1621895685919&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffaye-websocket%2Fdownload%2Ffaye-websocket-0.11.4.tgz",
+      "integrity": "sha1-fw2Sdc/dhqHJY9yLZfzEUe3Lsdo=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": ">=0.5.1"
+      }
+    },
+    "fb-watchman": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+      "dev": true,
+      "requires": {
+        "bser": "2.1.1"
+      }
+    },
+    "figgy-pudding": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4="
+    },
+    "file-loader": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npm.taobao.org/file-loader/download/file-loader-4.3.0.tgz",
+      "integrity": "sha1-eA8ED3KbPRgBnyBgX3I+hEuKWK8=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.2.3",
+        "schema-utils": "^2.5.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "2.7.1",
+          "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-2.7.1.tgz",
+          "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.5",
+            "ajv": "^6.12.4",
+            "ajv-keywords": "^3.5.2"
+          }
+        }
+      }
+    },
+    "file-type": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
+      "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==",
+      "dev": true
+    },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=",
+      "optional": true
+    },
+    "filesize": {
+      "version": "3.6.1",
+      "resolved": "https://registry.nlark.com/filesize/download/filesize-3.6.1.tgz",
+      "integrity": "sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc=",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz",
+      "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "find-cache-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-2.1.0.tgz?cache=0&sync_timestamp=1630260035189&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-2.1.0.tgz",
+      "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=",
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^2.0.0",
+        "pkg-dir": "^3.0.0"
+      }
+    },
+    "find-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/find-up/download/find-up-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz",
+      "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=",
+      "requires": {
+        "locate-path": "^3.0.0"
+      }
+    },
+    "flush-write-stream": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=",
+      "requires": {
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.3.6"
+      }
+    },
+    "flyio": {
+      "version": "0.6.14",
+      "resolved": "https://registry.npmjs.org/flyio/-/flyio-0.6.14.tgz",
+      "integrity": "sha512-RE2OXE1ZZmcXOKb0jCtGyquHDxpAqHg17CZ8lmQKRfl3x1kP+NBpaQDx4WgN7DNpLJjFnspTzTEQpwRGg6/xaA==",
+      "requires": {
+        "request": "^2.85.0"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.14.3",
+      "resolved": "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.3.tgz",
+      "integrity": "sha1-atp4EY2NJMruWVWVrM3ArGq9Ai4=",
+      "dev": true
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+    },
+    "fork-ts-checker-webpack-plugin": {
+      "version": "3.1.1",
+      "resolved": "https://registry.nlark.com/fork-ts-checker-webpack-plugin/download/fork-ts-checker-webpack-plugin-3.1.1.tgz",
+      "integrity": "sha1-oWQsDT5l9QwswXQunAqA9EH4axk=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.22.0",
+        "chalk": "^2.4.1",
+        "chokidar": "^3.3.0",
+        "micromatch": "^3.1.10",
+        "minimatch": "^3.0.4",
+        "semver": "^5.6.0",
+        "tapable": "^1.0.0",
+        "worker-rpc": "^0.1.0"
+      }
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz",
+      "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=",
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "formidable": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz",
+      "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ=="
+    },
+    "forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz?cache=0&sync_timestamp=1622503451002&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fforwarded%2Fdownload%2Fforwarded-0.2.0.tgz",
+      "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs-extra": {
+      "version": "7.0.1",
+      "resolved": "https://registry.nlark.com/fs-extra/download/fs-extra-7.0.1.tgz",
+      "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
+    "fs-monkey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
+      "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
+      "dev": true,
+      "optional": true
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz?cache=0&sync_timestamp=1612536422255&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.3.2.tgz",
+      "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=",
+      "optional": true
+    },
+    "fstream": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz",
+      "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0="
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
+      "requires": {
+        "aproba": "^1.0.3",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.0",
+        "object-assign": "^4.1.0",
+        "signal-exit": "^3.0.0",
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wide-align": "^1.1.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "gaze": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+      "requires": {
+        "globule": "^1.0.0"
+      }
+    },
+    "gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA="
+    },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz",
+      "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34="
+    },
+    "get-intrinsic": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/get-intrinsic/download/get-intrinsic-1.1.1.tgz?cache=0&sync_timestamp=1612364352840&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-intrinsic%2Fdownload%2Fget-intrinsic-1.1.1.tgz",
+      "integrity": "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "get-package-type": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw=="
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-4.1.0.tgz",
+      "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=",
+      "dev": true,
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "get-them-args": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/get-them-args/-/get-them-args-1.3.2.tgz",
+      "integrity": "sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==",
+      "dev": true
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.7",
+      "resolved": "https://registry.nlark.com/glob/download/glob-7.1.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob%2Fdownload%2Fglob-7.1.7.tgz",
+      "integrity": "sha1-Oxk+kjPwHULQs/eClLvutBj5SpA=",
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-escape": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/glob-escape/-/glob-escape-0.0.2.tgz",
+      "integrity": "sha512-L/cXYz8x7qer1HAyUQ+mbjcUsJVdpRxpAf7CwqHoNBs9vTpABlGfNN4tzkDxt+u3Z7ZncVyKlCNPtzb0R/7WbA==",
+      "dev": true
+    },
+    "glob-parent": {
+      "version": "3.1.0",
+      "resolved": "https://registry.nlark.com/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1626760200164&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "requires": {
+        "is-glob": "^3.1.0",
+        "path-dirname": "^1.0.0"
+      },
+      "dependencies": {
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        }
+      }
+    },
+    "glob-to-regexp": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npm.taobao.org/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz",
+      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+      "dev": true
+    },
+    "global": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+      "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+      "dev": true,
+      "requires": {
+        "min-document": "^2.19.0",
+        "process": "^0.11.10"
+      }
+    },
+    "globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.nlark.com/globals/download/globals-11.12.0.tgz",
+      "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4="
+    },
+    "globby": {
+      "version": "7.1.1",
+      "resolved": "https://registry.nlark.com/globby/download/globby-7.1.1.tgz",
+      "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+      "dev": true,
+      "requires": {
+        "array-union": "^1.0.1",
+        "dir-glob": "^2.0.0",
+        "glob": "^7.1.2",
+        "ignore": "^3.3.5",
+        "pify": "^3.0.0",
+        "slash": "^1.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
+    },
+    "globule": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz",
+      "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==",
+      "requires": {
+        "glob": "~7.1.1",
+        "lodash": "^4.17.21",
+        "minimatch": "~3.0.2"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.8",
+      "resolved": "https://registry.nlark.com/graceful-fs/download/graceful-fs-4.2.8.tgz",
+      "integrity": "sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo="
+    },
+    "growly": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+      "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==",
+      "dev": true,
+      "optional": true
+    },
+    "gzip-size": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npm.taobao.org/gzip-size/download/gzip-size-5.1.1.tgz?cache=0&sync_timestamp=1605523140245&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgzip-size%2Fdownload%2Fgzip-size-5.1.1.tgz",
+      "integrity": "sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ=",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.1",
+        "pify": "^4.0.1"
+      }
+    },
+    "handle-thing": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.1.tgz",
+      "integrity": "sha1-hX95zjWVgMNA1DCBzGSJcNC7I04=",
+      "dev": true
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+    },
+    "har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.5.tgz",
+      "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=",
+      "requires": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz",
+      "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+        }
+      }
+    },
+    "has-bigints": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/has-bigints/download/has-bigints-1.0.1.tgz?cache=0&sync_timestamp=1615461427142&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-bigints%2Fdownload%2Fhas-bigints-1.0.1.tgz",
+      "integrity": "sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM=",
+      "dev": true
+    },
+    "has-binary2": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
+      "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
+      "requires": {
+        "isarray": "2.0.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ=="
+        }
+      }
+    },
+    "has-cors": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+      "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA=="
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+    },
+    "has-symbols": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.2.tgz?cache=0&sync_timestamp=1614443577352&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-symbols%2Fdownload%2Fhas-symbols-1.0.2.tgz",
+      "integrity": "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM="
+    },
+    "has-tostringtag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz",
+      "integrity": "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=",
+      "requires": {
+        "has-symbols": "^1.0.2"
+      }
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/hash-base/download/hash-base-3.1.0.tgz",
+      "integrity": "sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM=",
+      "requires": {
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz",
+          "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz",
+          "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY="
+        }
+      }
+    },
+    "hash-sum": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
+      "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ="
+    },
+    "hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz",
+      "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=",
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz",
+      "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8="
+    },
+    "hex-color-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/hex-color-regex/download/hex-color-regex-1.1.0.tgz",
+      "integrity": "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=",
+      "dev": true
+    },
+    "highlight.js": {
+      "version": "10.7.3",
+      "resolved": "https://registry.nlark.com/highlight.js/download/highlight.js-10.7.3.tgz",
+      "integrity": "sha1-aXJy45kTVuQMPKxWanTu9oF1ZTE=",
+      "dev": true
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "hoopy": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npm.taobao.org/hoopy/download/hoopy-0.1.4.tgz",
+      "integrity": "sha1-YJIH1mEQADOpqUAq096mdzgcGx0=",
+      "dev": true
+    },
+    "hosted-git-info": {
+      "version": "2.8.9",
+      "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.9.tgz?cache=0&sync_timestamp=1617826545071&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.9.tgz",
+      "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k="
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "hsl-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/hsl-regex/download/hsl-regex-1.0.0.tgz",
+      "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
+      "dev": true
+    },
+    "hsla-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/hsla-regex/download/hsla-regex-1.0.0.tgz",
+      "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
+      "dev": true
+    },
+    "html-encoding-sniffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
+      "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
+      "dev": true,
+      "requires": {
+        "whatwg-encoding": "^1.0.1"
+      }
+    },
+    "html-entities": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.4.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-entities%2Fdownload%2Fhtml-entities-1.4.0.tgz",
+      "integrity": "sha1-z70bAdKvr5rcobEK59/6uYxx0tw=",
+      "dev": true
+    },
+    "html-escaper": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+      "dev": true
+    },
+    "html-minifier": {
+      "version": "3.5.21",
+      "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz",
+      "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=",
+      "dev": true,
+      "requires": {
+        "camel-case": "3.0.x",
+        "clean-css": "4.2.x",
+        "commander": "2.17.x",
+        "he": "1.2.x",
+        "param-case": "2.1.x",
+        "relateurl": "0.2.x",
+        "uglify-js": "3.4.x"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.17.1",
+          "resolved": "https://registry.nlark.com/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1627358254258&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz",
+          "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=",
+          "dev": true
+        }
+      }
+    },
+    "html-tags": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-3.1.0.tgz",
+      "integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=",
+      "dev": true
+    },
+    "html-webpack-plugin": {
+      "version": "3.2.0",
+      "resolved": "https://registry.nlark.com/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz?cache=0&sync_timestamp=1624607980294&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhtml-webpack-plugin%2Fdownload%2Fhtml-webpack-plugin-3.2.0.tgz",
+      "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
+      "dev": true,
+      "requires": {
+        "html-minifier": "^3.2.3",
+        "loader-utils": "^0.2.16",
+        "lodash": "^4.17.3",
+        "pretty-error": "^2.0.2",
+        "tapable": "^1.0.0",
+        "toposort": "^1.0.0",
+        "util.promisify": "1.0.0"
+      },
+      "dependencies": {
+        "big.js": {
+          "version": "3.2.0",
+          "resolved": "https://registry.nlark.com/big.js/download/big.js-3.2.0.tgz",
+          "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=",
+          "dev": true
+        },
+        "emojis-list": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz",
+          "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+          "dev": true
+        },
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz",
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
+        },
+        "loader-utils": {
+          "version": "0.2.17",
+          "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz",
+          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+          "dev": true,
+          "requires": {
+            "big.js": "^3.1.3",
+            "emojis-list": "^2.0.0",
+            "json5": "^0.5.0",
+            "object-assign": "^4.0.1"
+          }
+        },
+        "util.promisify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&sync_timestamp=1610159819836&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz",
+          "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=",
+          "dev": true,
+          "requires": {
+            "define-properties": "^1.1.2",
+            "object.getownpropertydescriptors": "^2.0.3"
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "6.1.0",
+      "resolved": "https://registry.nlark.com/htmlparser2/download/htmlparser2-6.1.0.tgz?cache=0&sync_timestamp=1630242708769&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-6.1.0.tgz",
+      "integrity": "sha1-xNditsM3GgXb5l6UrkOp+EX7j7c=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.0.0",
+        "domutils": "^2.5.2",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "dom-serializer": {
+          "version": "1.3.2",
+          "resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256858583&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz",
+          "integrity": "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "domhandler": "^4.2.0",
+            "entities": "^2.0.0"
+          }
+        },
+        "domelementtype": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz",
+          "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=",
+          "dev": true
+        },
+        "domutils": {
+          "version": "2.8.0",
+          "resolved": "https://registry.nlark.com/domutils/download/domutils-2.8.0.tgz?cache=0&sync_timestamp=1630106535879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-2.8.0.tgz",
+          "integrity": "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "^1.0.1",
+            "domelementtype": "^2.2.0",
+            "domhandler": "^4.2.0"
+          }
+        }
+      }
+    },
+    "http-assert": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz",
+      "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==",
+      "requires": {
+        "deep-equal": "~1.0.1",
+        "http-errors": "~1.8.0"
+      },
+      "dependencies": {
+        "deep-equal": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+          "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw=="
+        },
+        "http-errors": {
+          "version": "1.8.1",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+          "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.4",
+            "setprototypeof": "1.2.0",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.1"
+          }
+        },
+        "setprototypeof": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+          "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+        },
+        "toidentifier": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+          "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
+        }
+      }
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz",
+      "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=",
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        }
+      }
+    },
+    "http-parser-js": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.5.3.tgz?cache=0&sync_timestamp=1609540073700&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-parser-js%2Fdownload%2Fhttp-parser-js-0.5.3.tgz",
+      "integrity": "sha1-AdJwnHnUFpi7AdTezF6dpOSgM9k=",
+      "dev": true
+    },
+    "http-proxy": {
+      "version": "1.18.1",
+      "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz",
+      "integrity": "sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "^4.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "1.3.1",
+      "resolved": "https://registry.nlark.com/http-proxy-middleware/download/http-proxy-middleware-1.3.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhttp-proxy-middleware%2Fdownload%2Fhttp-proxy-middleware-1.3.1.tgz",
+      "integrity": "sha1-Q3ANbZ7st0Gb8IahKND3IF2etmU=",
+      "dev": true,
+      "requires": {
+        "@types/http-proxy": "^1.17.5",
+        "http-proxy": "^1.18.1",
+        "is-glob": "^4.0.1",
+        "is-plain-obj": "^3.0.0",
+        "micromatch": "^4.0.2"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz",
+          "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz",
+          "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz",
+          "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.4",
+          "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.4.tgz?cache=0&sync_timestamp=1618054885525&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-4.0.4.tgz",
+          "integrity": "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.2.3"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz",
+          "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
+    },
+    "human-signals": {
+      "version": "1.1.1",
+      "resolved": "https://registry.nlark.com/human-signals/download/human-signals-1.1.1.tgz",
+      "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=",
+      "dev": true
+    },
+    "i18n": {
+      "version": "0.13.4",
+      "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.13.4.tgz",
+      "integrity": "sha512-GZnXWeA15jTi9gc1jfgrJcSrNYDg7qbJXSYMuibqPYb1ThORmGCeM+gL6LrDagYRHh87/q/D0jRSOhAfv6wAow==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.3.3",
+        "make-plural": "^7.0.0",
+        "math-interval-parser": "^2.0.1",
+        "messageformat": "^2.3.0",
+        "mustache": "^4.2.0",
+        "sprintf-js": "^1.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+          "dev": true,
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "sprintf-js": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+          "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+          "dev": true
+        }
+      }
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz",
+      "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "icss-replace-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+      "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg=="
+    },
+    "icss-utils": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz?cache=0&sync_timestamp=1605801266348&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-4.1.1.tgz",
+      "integrity": "sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc=",
+      "requires": {
+        "postcss": "^7.0.14"
+      }
+    },
+    "ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.2.1.tgz",
+      "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I="
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
+    },
+    "ignore": {
+      "version": "3.3.10",
+      "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz",
+      "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=",
+      "dev": true
+    },
+    "immediate": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
+    },
+    "import-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz",
+      "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
+      "dev": true,
+      "requires": {
+        "import-from": "^2.1.0"
+      }
+    },
+    "import-fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz?cache=0&sync_timestamp=1608469532269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-2.0.0.tgz",
+      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+      "dev": true,
+      "requires": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-from": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/import-from/download/import-from-2.1.0.tgz",
+      "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz",
+      "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+    },
+    "in-publish": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz",
+      "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ=="
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+      "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==",
+      "requires": {
+        "repeating": "^2.0.0"
+      }
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+      "dev": true
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg=="
+    },
+    "infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz",
+      "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc="
+    },
+    "inflation": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz",
+      "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ=="
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz",
+      "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w="
+    },
+    "ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+      "dev": true
+    },
+    "internal-ip": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npm.taobao.org/internal-ip/download/internal-ip-4.3.0.tgz",
+      "integrity": "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc=",
+      "dev": true,
+      "requires": {
+        "default-gateway": "^4.2.0",
+        "ipaddr.js": "^1.9.0"
+      },
+      "dependencies": {
+        "default-gateway": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-4.2.0.tgz?cache=0&sync_timestamp=1610365816953&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdefault-gateway%2Fdownload%2Fdefault-gateway-4.2.0.tgz",
+          "integrity": "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs=",
+          "dev": true,
+          "requires": {
+            "execa": "^1.0.0",
+            "ip-regex": "^2.1.0"
+          }
+        }
+      }
+    },
+    "internal-slot": {
+      "version": "1.0.3",
+      "resolved": "https://registry.nlark.com/internal-slot/download/internal-slot-1.0.3.tgz",
+      "integrity": "sha1-c0fjB97uovqsKsYgXUvH00ln9Zw=",
+      "dev": true,
+      "requires": {
+        "get-intrinsic": "^1.1.0",
+        "has": "^1.0.3",
+        "side-channel": "^1.0.4"
+      }
+    },
+    "interpret": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
+    },
+    "intersection-observer": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz",
+      "integrity": "sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg=="
+    },
+    "invert-kv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz",
+      "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+      "dev": true
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/ip-regex/download/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=",
+      "dev": true
+    },
+    "is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/is-absolute-url/download/is-absolute-url-2.1.0.tgz?cache=0&sync_timestamp=1628691826939&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-absolute-url%2Fdownload%2Fis-absolute-url-2.1.0.tgz",
+      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-arguments": {
+      "version": "1.1.1",
+      "resolved": "https://registry.nlark.com/is-arguments/download/is-arguments-1.1.1.tgz?cache=0&sync_timestamp=1628202633313&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-arguments%2Fdownload%2Fis-arguments-1.1.1.tgz",
+      "integrity": "sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+    },
+    "is-bigint": {
+      "version": "1.0.4",
+      "resolved": "https://registry.nlark.com/is-bigint/download/is-bigint-1.0.4.tgz?cache=0&sync_timestamp=1628747504782&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-bigint%2Fdownload%2Fis-bigint-1.0.4.tgz",
+      "integrity": "sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=",
+      "dev": true,
+      "requires": {
+        "has-bigints": "^1.0.1"
+      }
+    },
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz",
+      "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=",
+      "requires": {
+        "binary-extensions": "^2.0.0"
+      }
+    },
+    "is-boolean-object": {
+      "version": "1.1.2",
+      "resolved": "https://registry.nlark.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz",
+      "integrity": "sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz",
+      "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4="
+    },
+    "is-callable": {
+      "version": "1.2.4",
+      "resolved": "https://registry.nlark.com/is-callable/download/is-callable-1.2.4.tgz",
+      "integrity": "sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU=",
+      "dev": true
+    },
+    "is-ci": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz",
+      "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=",
+      "dev": true,
+      "requires": {
+        "ci-info": "^1.5.0"
+      }
+    },
+    "is-color-stop": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-color-stop/download/is-color-stop-1.1.0.tgz",
+      "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
+      "dev": true,
+      "requires": {
+        "css-color-names": "^0.0.4",
+        "hex-color-regex": "^1.1.0",
+        "hsl-regex": "^1.0.0",
+        "hsla-regex": "^1.0.0",
+        "rgb-regex": "^1.0.1",
+        "rgba-regex": "^1.0.0"
+      }
+    },
+    "is-core-module": {
+      "version": "2.6.0",
+      "resolved": "https://registry.nlark.com/is-core-module/download/is-core-module-2.6.0.tgz",
+      "integrity": "sha1-11U7JSb+Wbkro+QMjfdX7Ipwnhk=",
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.5",
+      "resolved": "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.5.tgz?cache=0&sync_timestamp=1628202499310&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.5.tgz",
+      "integrity": "sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=",
+      "dev": true,
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+      "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "dev": true
+    },
+    "is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.nlark.com/is-docker/download/is-docker-2.2.1.tgz",
+      "integrity": "sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao=",
+      "dev": true
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+    },
+    "is-finite": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="
+    },
+    "is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+    },
+    "is-function": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+      "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==",
+      "dev": true
+    },
+    "is-generator-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+      "dev": true
+    },
+    "is-generator-function": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+      "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
+      "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-negative-zero": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/is-negative-zero/download/is-negative-zero-2.0.1.tgz?cache=0&sync_timestamp=1607123314998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-negative-zero%2Fdownload%2Fis-negative-zero-2.0.1.tgz",
+      "integrity": "sha1-PedGwY3aIxkkGlNnWQjY92bxHCQ=",
+      "dev": true
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-number-object": {
+      "version": "1.0.6",
+      "resolved": "https://registry.nlark.com/is-number-object/download/is-number-object-1.0.6.tgz",
+      "integrity": "sha1-anqvg4x/BoalC0VT9+VKlklOifA=",
+      "dev": true,
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-obj": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz?cache=0&sync_timestamp=1618600242427&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-obj%2Fdownload%2Fis-obj-2.0.0.tgz",
+      "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=",
+      "dev": true
+    },
+    "is-path-cwd": {
+      "version": "2.2.0",
+      "resolved": "https://registry.nlark.com/is-path-cwd/download/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s=",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz?cache=0&sync_timestamp=1620047156679&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-in-cwd%2Fdownload%2Fis-path-in-cwd-2.1.0.tgz",
+      "integrity": "sha1-v+Lcomxp85cmWkAJljYCk1oFOss=",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "^2.1.0"
+      }
+    },
+    "is-path-inside": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/is-path-inside/download/is-path-inside-2.1.0.tgz?cache=0&sync_timestamp=1620046845369&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-inside%2Fdownload%2Fis-path-inside-2.1.0.tgz",
+      "integrity": "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI=",
+      "dev": true,
+      "requires": {
+        "path-is-inside": "^1.0.2"
+      }
+    },
+    "is-plain-obj": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-3.0.0.tgz?cache=0&sync_timestamp=1618600554597&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-3.0.0.tgz",
+      "integrity": "sha1-r28uoUrFpkYYOlu9tbqrvBVq2dc=",
+      "dev": true
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz?cache=0&sync_timestamp=1599667279942&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-object%2Fdownload%2Fis-plain-object-2.0.4.tgz",
+      "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-regex": {
+      "version": "1.1.4",
+      "resolved": "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz?cache=0&sync_timestamp=1628221905423&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-regex%2Fdownload%2Fis-regex-1.1.4.tgz",
+      "integrity": "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-resolvable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz",
+      "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=",
+      "dev": true
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.nlark.com/is-stream/download/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-string": {
+      "version": "1.0.7",
+      "resolved": "https://registry.nlark.com/is-string/download/is-string-1.0.7.tgz?cache=0&sync_timestamp=1628213433356&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-string%2Fdownload%2Fis-string-1.0.7.tgz",
+      "integrity": "sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=",
+      "dev": true,
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.4",
+      "resolved": "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.4.tgz",
+      "integrity": "sha1-ptrJO2NbBjymhyI23oiRClevE5w=",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.2"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q=="
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz",
+      "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0="
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+    },
+    "istanbul-lib-coverage": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+      "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+      "dev": true
+    },
+    "istanbul-lib-instrument": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.7.5",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-coverage": "^3.0.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+          "dev": true
+        }
+      }
+    },
+    "istanbul-lib-report": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+      "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+      "dev": true,
+      "requires": {
+        "istanbul-lib-coverage": "^3.0.0",
+        "make-dir": "^4.0.0",
+        "supports-color": "^7.1.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+          "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+          "dev": true,
+          "requires": {
+            "semver": "^7.5.3"
+          }
+        },
+        "semver": {
+          "version": "7.6.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+          "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-lib-source-maps": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "istanbul-lib-coverage": "^3.0.0",
+        "source-map": "^0.6.1"
+      }
+    },
+    "istanbul-reports": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+      "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+      "dev": true,
+      "requires": {
+        "html-escaper": "^2.0.0",
+        "istanbul-lib-report": "^3.0.0"
+      }
+    },
+    "javascript-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/javascript-stringify/download/javascript-stringify-2.1.0.tgz",
+      "integrity": "sha1-J8dlOb4U2L0Sghmi1zGwkzeQTnk=",
+      "dev": true
+    },
+    "jest": {
+      "version": "25.5.4",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-25.5.4.tgz",
+      "integrity": "sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==",
+      "dev": true,
+      "requires": {
+        "@jest/core": "^25.5.4",
+        "import-local": "^3.0.2",
+        "jest-cli": "^25.5.4"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+          "dev": true
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "import-local": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+          "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+          "dev": true,
+          "requires": {
+            "pkg-dir": "^4.2.0",
+            "resolve-cwd": "^3.0.0"
+          }
+        },
+        "is-ci": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+          "dev": true,
+          "requires": {
+            "ci-info": "^2.0.0"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "jest-cli": {
+          "version": "25.5.4",
+          "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.4.tgz",
+          "integrity": "sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==",
+          "dev": true,
+          "requires": {
+            "@jest/core": "^25.5.4",
+            "@jest/test-result": "^25.5.0",
+            "@jest/types": "^25.5.0",
+            "chalk": "^3.0.0",
+            "exit": "^0.1.2",
+            "graceful-fs": "^4.2.4",
+            "import-local": "^3.0.2",
+            "is-ci": "^2.0.0",
+            "jest-config": "^25.5.4",
+            "jest-util": "^25.5.0",
+            "jest-validate": "^25.5.0",
+            "prompts": "^2.0.1",
+            "realpath-native": "^2.0.0",
+            "yargs": "^15.3.1"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        },
+        "resolve-cwd": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+          "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+          "dev": true,
+          "requires": {
+            "resolve-from": "^5.0.0"
+          }
+        },
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "jest-changed-files": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz",
+      "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "execa": "^3.2.0",
+        "throat": "^5.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "execa": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
+          "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "p-finally": "^2.0.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-stream": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "p-finally": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+          "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+          "dev": true
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "jest-config": {
+      "version": "25.5.4",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz",
+      "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "@jest/test-sequencer": "^25.5.4",
+        "@jest/types": "^25.5.0",
+        "babel-jest": "^25.5.1",
+        "chalk": "^3.0.0",
+        "deepmerge": "^4.2.2",
+        "glob": "^7.1.1",
+        "graceful-fs": "^4.2.4",
+        "jest-environment-jsdom": "^25.5.0",
+        "jest-environment-node": "^25.5.0",
+        "jest-get-type": "^25.2.6",
+        "jest-jasmine2": "^25.5.4",
+        "jest-regex-util": "^25.2.6",
+        "jest-resolve": "^25.5.1",
+        "jest-util": "^25.5.0",
+        "jest-validate": "^25.5.0",
+        "micromatch": "^4.0.2",
+        "pretty-format": "^25.5.0",
+        "realpath-native": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "deepmerge": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+          "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+          "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.2",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "picomatch": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+          "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "jest-diff": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz",
+      "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==",
+      "dev": true,
+      "requires": {
+        "chalk": "^3.0.0",
+        "diff-sequences": "^25.2.6",
+        "jest-get-type": "^25.2.6",
+        "pretty-format": "^25.5.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-docblock": {
+      "version": "25.3.0",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz",
+      "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==",
+      "dev": true,
+      "requires": {
+        "detect-newline": "^3.0.0"
+      }
+    },
+    "jest-each": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz",
+      "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "chalk": "^3.0.0",
+        "jest-get-type": "^25.2.6",
+        "jest-util": "^25.5.0",
+        "pretty-format": "^25.5.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-environment-jsdom": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz",
+      "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^25.5.0",
+        "@jest/fake-timers": "^25.5.0",
+        "@jest/types": "^25.5.0",
+        "jest-mock": "^25.5.0",
+        "jest-util": "^25.5.0",
+        "jsdom": "^15.2.1"
+      }
+    },
+    "jest-environment-node": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz",
+      "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^25.5.0",
+        "@jest/fake-timers": "^25.5.0",
+        "@jest/types": "^25.5.0",
+        "jest-mock": "^25.5.0",
+        "jest-util": "^25.5.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+          "dev": true
+        }
+      }
+    },
+    "jest-get-type": {
+      "version": "25.2.6",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+      "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
+      "dev": true
+    },
+    "jest-haste-map": {
+      "version": "25.5.1",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz",
+      "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "@types/graceful-fs": "^4.1.2",
+        "anymatch": "^3.0.3",
+        "fb-watchman": "^2.0.0",
+        "fsevents": "^2.1.2",
+        "graceful-fs": "^4.2.4",
+        "jest-serializer": "^25.5.0",
+        "jest-util": "^25.5.0",
+        "jest-worker": "^25.5.0",
+        "micromatch": "^4.0.2",
+        "sane": "^4.0.3",
+        "walker": "^1.0.7",
+        "which": "^2.0.2"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+          "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.2",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "picomatch": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+          "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+          "dev": true
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "jest-jasmine2": {
+      "version": "25.5.4",
+      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz",
+      "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "^7.1.0",
+        "@jest/environment": "^25.5.0",
+        "@jest/source-map": "^25.5.0",
+        "@jest/test-result": "^25.5.0",
+        "@jest/types": "^25.5.0",
+        "chalk": "^3.0.0",
+        "co": "^4.6.0",
+        "expect": "^25.5.0",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^25.5.0",
+        "jest-matcher-utils": "^25.5.0",
+        "jest-message-util": "^25.5.0",
+        "jest-runtime": "^25.5.4",
+        "jest-snapshot": "^25.5.1",
+        "jest-util": "^25.5.0",
+        "pretty-format": "^25.5.0",
+        "throat": "^5.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-leak-detector": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz",
+      "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==",
+      "dev": true,
+      "requires": {
+        "jest-get-type": "^25.2.6",
+        "pretty-format": "^25.5.0"
+      }
+    },
+    "jest-matcher-utils": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz",
+      "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^3.0.0",
+        "jest-diff": "^25.5.0",
+        "jest-get-type": "^25.2.6",
+        "pretty-format": "^25.5.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-message-util": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz",
+      "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@jest/types": "^25.5.0",
+        "@types/stack-utils": "^1.0.1",
+        "chalk": "^3.0.0",
+        "graceful-fs": "^4.2.4",
+        "micromatch": "^4.0.2",
+        "slash": "^3.0.0",
+        "stack-utils": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.5",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+          "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.2",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "picomatch": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+          "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "jest-mock": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz",
+      "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0"
+      }
+    },
+    "jest-pnp-resolver": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+      "dev": true
+    },
+    "jest-regex-util": {
+      "version": "25.2.6",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz",
+      "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==",
+      "dev": true
+    },
+    "jest-resolve": {
+      "version": "25.5.1",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz",
+      "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "browser-resolve": "^1.11.3",
+        "chalk": "^3.0.0",
+        "graceful-fs": "^4.2.4",
+        "jest-pnp-resolver": "^1.2.1",
+        "read-pkg-up": "^7.0.1",
+        "realpath-native": "^2.0.0",
+        "resolve": "^1.17.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-resolve-dependencies": {
+      "version": "25.5.4",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz",
+      "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "jest-regex-util": "^25.2.6",
+        "jest-snapshot": "^25.5.1"
+      }
+    },
+    "jest-runner": {
+      "version": "25.5.4",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz",
+      "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^25.5.0",
+        "@jest/environment": "^25.5.0",
+        "@jest/test-result": "^25.5.0",
+        "@jest/types": "^25.5.0",
+        "chalk": "^3.0.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.4",
+        "jest-config": "^25.5.4",
+        "jest-docblock": "^25.3.0",
+        "jest-haste-map": "^25.5.1",
+        "jest-jasmine2": "^25.5.4",
+        "jest-leak-detector": "^25.5.0",
+        "jest-message-util": "^25.5.0",
+        "jest-resolve": "^25.5.1",
+        "jest-runtime": "^25.5.4",
+        "jest-util": "^25.5.0",
+        "jest-worker": "^25.5.0",
+        "source-map-support": "^0.5.6",
+        "throat": "^5.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-runtime": {
+      "version": "25.5.4",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz",
+      "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^25.5.0",
+        "@jest/environment": "^25.5.0",
+        "@jest/globals": "^25.5.2",
+        "@jest/source-map": "^25.5.0",
+        "@jest/test-result": "^25.5.0",
+        "@jest/transform": "^25.5.1",
+        "@jest/types": "^25.5.0",
+        "@types/yargs": "^15.0.0",
+        "chalk": "^3.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "exit": "^0.1.2",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.4",
+        "jest-config": "^25.5.4",
+        "jest-haste-map": "^25.5.1",
+        "jest-message-util": "^25.5.0",
+        "jest-mock": "^25.5.0",
+        "jest-regex-util": "^25.2.6",
+        "jest-resolve": "^25.5.1",
+        "jest-snapshot": "^25.5.1",
+        "jest-util": "^25.5.0",
+        "jest-validate": "^25.5.0",
+        "realpath-native": "^2.0.0",
+        "slash": "^3.0.0",
+        "strip-bom": "^4.0.0",
+        "yargs": "^15.3.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "jest-serializer": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz",
+      "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.2.4"
+      }
+    },
+    "jest-snapshot": {
+      "version": "25.5.1",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz",
+      "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0",
+        "@jest/types": "^25.5.0",
+        "@types/prettier": "^1.19.0",
+        "chalk": "^3.0.0",
+        "expect": "^25.5.0",
+        "graceful-fs": "^4.2.4",
+        "jest-diff": "^25.5.0",
+        "jest-get-type": "^25.2.6",
+        "jest-matcher-utils": "^25.5.0",
+        "jest-message-util": "^25.5.0",
+        "jest-resolve": "^25.5.1",
+        "make-dir": "^3.0.0",
+        "natural-compare": "^1.4.0",
+        "pretty-format": "^25.5.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-util": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz",
+      "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "chalk": "^3.0.0",
+        "graceful-fs": "^4.2.4",
+        "is-ci": "^2.0.0",
+        "make-dir": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+          "dev": true
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-ci": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+          "dev": true,
+          "requires": {
+            "ci-info": "^2.0.0"
+          }
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-validate": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz",
+      "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "camelcase": "^5.3.1",
+        "chalk": "^3.0.0",
+        "jest-get-type": "^25.2.6",
+        "leven": "^3.1.0",
+        "pretty-format": "^25.5.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-watcher": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz",
+      "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==",
+      "dev": true,
+      "requires": {
+        "@jest/test-result": "^25.5.0",
+        "@jest/types": "^25.5.0",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^3.0.0",
+        "jest-util": "^25.5.0",
+        "string-length": "^3.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-worker": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz",
+      "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==",
+      "dev": true,
+      "requires": {
+        "merge-stream": "^2.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jimp": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.10.3.tgz",
+      "integrity": "sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "@jimp/custom": "^0.10.3",
+        "@jimp/plugins": "^0.10.3",
+        "@jimp/types": "^0.10.3",
+        "core-js": "^3.4.1",
+        "regenerator-runtime": "^0.13.3"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.13.11",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+          "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+          "dev": true
+        }
+      }
+    },
+    "jpeg-js": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.7.tgz",
+      "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==",
+      "dev": true
+    },
+    "js-base64": {
+      "version": "2.6.4",
+      "resolved": "https://registry.nlark.com/js-base64/download/js-base64-2.6.4.tgz?cache=0&sync_timestamp=1621703335082&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-base64%2Fdownload%2Fjs-base64-2.6.4.tgz",
+      "integrity": "sha1-9OaGxd4eofhn28rT1G2WlCjfmMQ="
+    },
+    "js-message": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npm.taobao.org/js-message/download/js-message-1.0.7.tgz?cache=0&sync_timestamp=1605130346711&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-message%2Fdownload%2Fjs-message-1.0.7.tgz",
+      "integrity": "sha1-+93QU8ekcCGHG7iyyVOXzBfCDkc=",
+      "dev": true
+    },
+    "js-queue": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/js-queue/download/js-queue-2.0.2.tgz?cache=0&sync_timestamp=1605130347001&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-queue%2Fdownload%2Fjs-queue-2.0.2.tgz",
+      "integrity": "sha1-C+WQM4+QOzbHPTPDGIOoIUEs1II=",
+      "dev": true,
+      "requires": {
+        "easy-stack": "^1.0.1"
+      }
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz",
+      "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk="
+    },
+    "js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.nlark.com/js-yaml/download/js-yaml-3.14.1.tgz?cache=0&sync_timestamp=1618847165988&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.1.tgz",
+      "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+    },
+    "jsdom": {
+      "version": "15.2.1",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz",
+      "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.0",
+        "acorn": "^7.1.0",
+        "acorn-globals": "^4.3.2",
+        "array-equal": "^1.0.0",
+        "cssom": "^0.4.1",
+        "cssstyle": "^2.0.0",
+        "data-urls": "^1.1.0",
+        "domexception": "^1.0.1",
+        "escodegen": "^1.11.1",
+        "html-encoding-sniffer": "^1.0.2",
+        "nwsapi": "^2.2.0",
+        "parse5": "5.1.0",
+        "pn": "^1.1.0",
+        "request": "^2.88.0",
+        "request-promise-native": "^1.0.7",
+        "saxes": "^3.1.9",
+        "symbol-tree": "^3.2.2",
+        "tough-cookie": "^3.0.1",
+        "w3c-hr-time": "^1.0.1",
+        "w3c-xmlserializer": "^1.1.2",
+        "webidl-conversions": "^4.0.2",
+        "whatwg-encoding": "^1.0.5",
+        "whatwg-mimetype": "^2.3.0",
+        "whatwg-url": "^7.0.0",
+        "ws": "^7.0.0",
+        "xml-name-validator": "^3.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+          "dev": true
+        },
+        "parse5": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
+          "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==",
+          "dev": true
+        },
+        "tough-cookie": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
+          "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
+          "dev": true,
+          "requires": {
+            "ip-regex": "^2.1.0",
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
+        },
+        "ws": {
+          "version": "7.5.9",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+          "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+          "dev": true
+        }
+      }
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891242793&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz",
+      "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q="
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk="
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npm.taobao.org/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz?cache=0&sync_timestamp=1609553741994&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema%2Fdownload%2Fjson-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1608000211395&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz",
+      "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+    },
+    "json3": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz",
+      "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=",
+      "dev": true
+    },
+    "json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz",
+      "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=",
+      "requires": {
+        "minimist": "^1.2.0"
+      }
+    },
+    "jsonc-parser": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz",
+      "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==",
+      "dev": true
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz?cache=0&sync_timestamp=1604161912962&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "requires": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "jsrsasign": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-7.2.2.tgz",
+      "integrity": "sha512-hNN6476wY3ZP9X5HXdCmf/ovcbK+K56Fhg3cAIhgxy1WYXtGSNYDmlplecMqz1RbmqdBolkr4iyl5FAl6s4Xtg=="
+    },
+    "jszip": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+      "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+      "requires": {
+        "lie": "~3.3.0",
+        "pako": "~1.0.2",
+        "readable-stream": "~2.3.6",
+        "setimmediate": "^1.0.5"
+      }
+    },
+    "keygrip": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
+      "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
+      "requires": {
+        "tsscmp": "1.0.6"
+      }
+    },
+    "kill-port": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/kill-port/-/kill-port-1.6.1.tgz",
+      "integrity": "sha512-un0Y55cOM7JKGaLnGja28T38tDDop0AQ8N0KlAdyh+B1nmMoX8AnNmqPNZbS3mUMgiST51DCVqmbFT1gNJpVNw==",
+      "dev": true,
+      "requires": {
+        "get-them-args": "1.3.2",
+        "shell-exec": "1.0.2"
+      }
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz",
+      "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=",
+      "dev": true
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz",
+      "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0="
+    },
+    "kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "dev": true
+    },
+    "koa": {
+      "version": "2.15.3",
+      "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz",
+      "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==",
+      "requires": {
+        "accepts": "^1.3.5",
+        "cache-content-type": "^1.0.0",
+        "content-disposition": "~0.5.2",
+        "content-type": "^1.0.4",
+        "cookies": "~0.9.0",
+        "debug": "^4.3.2",
+        "delegates": "^1.0.0",
+        "depd": "^2.0.0",
+        "destroy": "^1.0.4",
+        "encodeurl": "^1.0.2",
+        "escape-html": "^1.0.3",
+        "fresh": "~0.5.2",
+        "http-assert": "^1.3.0",
+        "http-errors": "^1.6.3",
+        "is-generator-function": "^1.0.7",
+        "koa-compose": "^4.1.0",
+        "koa-convert": "^2.0.0",
+        "on-finished": "^2.3.0",
+        "only": "~0.0.2",
+        "parseurl": "^1.3.2",
+        "statuses": "^1.5.0",
+        "type-is": "^1.6.16",
+        "vary": "^1.1.2"
+      },
+      "dependencies": {
+        "depd": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+          "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+        },
+        "koa-compose": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz",
+          "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw=="
+        }
+      }
+    },
+    "koa-body": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/koa-body/-/koa-body-4.2.0.tgz",
+      "integrity": "sha512-wdGu7b9amk4Fnk/ytH8GuWwfs4fsB5iNkY8kZPpgQVb04QZSv85T0M8reb+cJmvLE8cjPYvBzRikD3s6qz8OoA==",
+      "requires": {
+        "@types/formidable": "^1.0.31",
+        "co-body": "^5.1.1",
+        "formidable": "^1.1.1"
+      },
+      "dependencies": {
+        "co-body": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/co-body/-/co-body-5.2.0.tgz",
+          "integrity": "sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==",
+          "requires": {
+            "inflation": "^2.0.0",
+            "qs": "^6.4.0",
+            "raw-body": "^2.2.0",
+            "type-is": "^1.6.14"
+          }
+        }
+      }
+    },
+    "koa-bodyparser": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz",
+      "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==",
+      "requires": {
+        "co-body": "^6.0.0",
+        "copy-to": "^2.0.1",
+        "type-is": "^1.6.18"
+      }
+    },
+    "koa-compose": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz",
+      "integrity": "sha512-8gen2cvKHIZ35eDEik5WOo8zbVp9t4cP8p4hW4uE55waxolLRexKKrqfCpwhGVppnB40jWeF8bZeTVg99eZgPw==",
+      "requires": {
+        "any-promise": "^1.1.0"
+      }
+    },
+    "koa-convert": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz",
+      "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==",
+      "requires": {
+        "co": "^4.6.0",
+        "koa-compose": "^4.1.0"
+      },
+      "dependencies": {
+        "koa-compose": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz",
+          "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw=="
+        }
+      }
+    },
+    "koa-mount": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/koa-mount/-/koa-mount-4.0.0.tgz",
+      "integrity": "sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==",
+      "requires": {
+        "debug": "^4.0.1",
+        "koa-compose": "^4.1.0"
+      },
+      "dependencies": {
+        "koa-compose": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz",
+          "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw=="
+        }
+      }
+    },
+    "koa-router": {
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz",
+      "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==",
+      "requires": {
+        "debug": "^3.1.0",
+        "http-errors": "^1.3.1",
+        "koa-compose": "^3.0.0",
+        "methods": "^1.0.1",
+        "path-to-regexp": "^1.1.1",
+        "urijs": "^1.19.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+        },
+        "path-to-regexp": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+          "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+          "requires": {
+            "isarray": "0.0.1"
+          }
+        }
+      }
+    },
+    "koa-send": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz",
+      "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==",
+      "requires": {
+        "debug": "^4.1.1",
+        "http-errors": "^1.7.3",
+        "resolve-path": "^1.4.0"
+      },
+      "dependencies": {
+        "http-errors": {
+          "version": "1.8.1",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+          "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.4",
+            "setprototypeof": "1.2.0",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.1"
+          }
+        },
+        "setprototypeof": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+          "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+        },
+        "toidentifier": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+          "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
+        }
+      }
+    },
+    "koa-static": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz",
+      "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==",
+      "requires": {
+        "debug": "^3.1.0",
+        "koa-send": "^5.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
+      }
+    },
+    "launch-editor": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/launch-editor/download/launch-editor-2.2.1.tgz",
+      "integrity": "sha1-hxtaPuOdZoD8wm03kwtu7aidsMo=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.3.0",
+        "shell-quote": "^1.6.1"
+      }
+    },
+    "launch-editor-middleware": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/launch-editor-middleware/download/launch-editor-middleware-2.2.1.tgz",
+      "integrity": "sha1-4UsH5scVSwpLhqD9NFeE5FgEwVc=",
+      "dev": true,
+      "requires": {
+        "launch-editor": "^2.2.1"
+      }
+    },
+    "lcid": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
+      "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+      "dev": true,
+      "requires": {
+        "invert-kv": "^3.0.0"
+      }
+    },
+    "leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true
+    },
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+      "requires": {
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
+      }
+    },
+    "licia": {
+      "version": "1.39.2",
+      "resolved": "https://registry.npmjs.org/licia/-/licia-1.39.2.tgz",
+      "integrity": "sha512-4pte7gXufSAa3JcsR0iT+2Lj2RX5Qpj+Nc0n84xs0ynNmw7eJmeZzk2oPTEtsQqwHwtT+NiX0arGkL5HPjTs7g==",
+      "dev": true
+    },
+    "lie": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+      "requires": {
+        "immediate": "~3.0.5"
+      }
+    },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
+    },
+    "load-bmfont": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz",
+      "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==",
+      "dev": true,
+      "requires": {
+        "buffer-equal": "0.0.1",
+        "mime": "^1.3.4",
+        "parse-bmfont-ascii": "^1.0.3",
+        "parse-bmfont-binary": "^1.0.5",
+        "parse-bmfont-xml": "^1.1.4",
+        "phin": "^2.9.1",
+        "xhr": "^2.0.1",
+        "xtend": "^4.0.0"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+          "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+          "dev": true
+        }
+      }
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+          "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
+          "requires": {
+            "error-ex": "^1.2.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="
+        },
+        "strip-bom": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+          "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==",
+          "requires": {
+            "is-utf8": "^0.2.0"
+          }
+        }
+      }
+    },
+    "loader-runner": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz?cache=0&sync_timestamp=1610027943366&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-runner%2Fdownload%2Floader-runner-2.4.0.tgz",
+      "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c="
+    },
+    "loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz",
+      "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=",
+      "requires": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      }
+    },
+    "locate-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/locate-path/download/locate-path-3.0.0.tgz",
+      "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=",
+      "requires": {
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz",
+      "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw="
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npm.taobao.org/lodash.debounce/download/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+    },
+    "lodash.defaultsdeep": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz",
+      "integrity": "sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY=",
+      "dev": true
+    },
+    "lodash.kebabcase": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npm.taobao.org/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz",
+      "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=",
+      "dev": true
+    },
+    "lodash.mapvalues": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz",
+      "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=",
+      "dev": true
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+      "dev": true
+    },
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+      "dev": true
+    },
+    "lodash.transform": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npm.taobao.org/lodash.transform/download/lodash.transform-4.6.0.tgz",
+      "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=",
+      "dev": true
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.nlark.com/log-symbols/download/log-symbols-2.2.0.tgz",
+      "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1"
+      }
+    },
+    "loglevel": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npm.taobao.org/loglevel/download/loglevel-1.7.1.tgz?cache=0&sync_timestamp=1606312222145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floglevel%2Fdownload%2Floglevel-1.7.1.tgz",
+      "integrity": "sha1-AF/eL15uRwaPk1/yhXPhJe9y8Zc=",
+      "dev": true
+    },
+    "lolex": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz",
+      "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==",
+      "dev": true,
+      "requires": {
+        "@sinonjs/commons": "^1.7.0"
+      }
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==",
+      "requires": {
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
+      }
+    },
+    "lower-case": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz?cache=0&sync_timestamp=1606867384237&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flower-case%2Fdownload%2Flower-case-1.1.4.tgz",
+      "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz",
+      "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=",
+      "requires": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      },
+      "dependencies": {
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+        }
+      }
+    },
+    "make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz",
+      "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=",
+      "requires": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      }
+    },
+    "make-plural": {
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.4.0.tgz",
+      "integrity": "sha512-4/gC9KVNTV6pvYg2gFeQYTW3mWaoJt7WZE5vrp1KnQDgW92JtYZnzmZT81oj/dUTqAIu0ufI2x3dkgu3bB1tYg==",
+      "dev": true
+    },
+    "makeerror": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+      "dev": true,
+      "requires": {
+        "tmpl": "1.0.5"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg=="
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "math-interval-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz",
+      "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==",
+      "dev": true
+    },
+    "md5": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
+      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+      "requires": {
+        "charenc": "0.0.2",
+        "crypt": "0.0.2",
+        "is-buffer": "~1.1.6"
+      }
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz",
+      "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=",
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "mdn-data": {
+      "version": "2.0.4",
+      "resolved": "https://registry.nlark.com/mdn-data/download/mdn-data-2.0.4.tgz",
+      "integrity": "sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs=",
+      "dev": true
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+    },
+    "memfs": {
+      "version": "3.4.13",
+      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz",
+      "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "fs-monkey": "^1.0.3"
+      }
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==",
+      "requires": {
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==",
+          "requires": {
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==",
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+          "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==",
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="
+        },
+        "read-pkg": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+          "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==",
+          "requires": {
+            "load-json-file": "^1.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^1.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+          "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==",
+          "requires": {
+            "find-up": "^1.0.0",
+            "read-pkg": "^1.0.0"
+          }
+        }
+      }
+    },
+    "merge": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz",
+      "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
+      "dev": true
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
+    },
+    "merge-source-map": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz",
+      "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=",
+      "requires": {
+        "source-map": "^0.6.1"
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz",
+      "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=",
+      "dev": true
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz",
+      "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=",
+      "dev": true
+    },
+    "messageformat": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz",
+      "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==",
+      "dev": true,
+      "requires": {
+        "make-plural": "^4.3.0",
+        "messageformat-formatters": "^2.0.1",
+        "messageformat-parser": "^4.1.2"
+      },
+      "dependencies": {
+        "make-plural": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz",
+          "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        }
+      }
+    },
+    "messageformat-formatters": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz",
+      "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==",
+      "dev": true
+    },
+    "messageformat-parser": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.3.tgz",
+      "integrity": "sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg==",
+      "dev": true
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+    },
+    "microevent.ts": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/microevent.ts/download/microevent.ts-0.1.1.tgz",
+      "integrity": "sha1-cLCbg/Q99RctAgWmMCW84Pc1f6A=",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz?cache=0&sync_timestamp=1618054885525&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-3.1.10.tgz",
+      "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz",
+      "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=",
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz",
+          "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og="
+        }
+      }
+    },
+    "mime": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.5.2.tgz",
+      "integrity": "sha1-bj3GzCuVEGQ4MOXxnVy3U9pe6r4="
+    },
+    "mime-db": {
+      "version": "1.49.0",
+      "resolved": "https://registry.nlark.com/mime-db/download/mime-db-1.49.0.tgz",
+      "integrity": "sha1-89/eYMmenPO8lwHWh3ePU3ABy+0="
+    },
+    "mime-types": {
+      "version": "2.1.32",
+      "resolved": "https://registry.nlark.com/mime-types/download/mime-types-2.1.32.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmime-types%2Fdownload%2Fmime-types-2.1.32.tgz",
+      "integrity": "sha1-HQDonn3n/gIAjbYQAdngKFJnD9U=",
+      "requires": {
+        "mime-db": "1.49.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz?cache=0&sync_timestamp=1617823824094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-1.2.0.tgz",
+      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
+      "dev": true
+    },
+    "min-document": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+      "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
+      "dev": true,
+      "requires": {
+        "dom-walk": "^0.1.0"
+      }
+    },
+    "mini-css-extract-plugin": {
+      "version": "0.9.0",
+      "resolved": "https://registry.nlark.com/mini-css-extract-plugin/download/mini-css-extract-plugin-0.9.0.tgz?cache=0&sync_timestamp=1630516348758&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmini-css-extract-plugin%2Fdownload%2Fmini-css-extract-plugin-0.9.0.tgz",
+      "integrity": "sha1-R/LPB6oWWrNXM7H8l9TEbAVkM54=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "normalize-url": "1.9.1",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.0"
+      },
+      "dependencies": {
+        "normalize-url": {
+          "version": "1.9.1",
+          "resolved": "https://registry.nlark.com/normalize-url/download/normalize-url-1.9.1.tgz?cache=0&sync_timestamp=1628689099559&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-url%2Fdownload%2Fnormalize-url-1.9.1.tgz",
+          "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+          "dev": true,
+          "requires": {
+            "object-assign": "^4.0.1",
+            "prepend-http": "^1.0.0",
+            "query-string": "^4.1.0",
+            "sort-keys": "^1.0.0"
+          }
+        }
+      }
+    },
+    "mini-types": {
+      "version": "0.1.7",
+      "resolved": "https://registry.nlark.com/mini-types/download/mini-types-0.1.7.tgz",
+      "integrity": "sha1-NtXqLPGGU7FvXRoCyNmzKccn0go=",
+      "dev": true
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc="
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz",
+      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz?cache=0&sync_timestamp=1602337228360&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz",
+      "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI="
+    },
+    "minipass": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz",
+      "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=",
+      "dev": true,
+      "requires": {
+        "yallist": "^4.0.0"
+      },
+      "dependencies": {
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz",
+          "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
+          "dev": true
+        }
+      }
+    },
+    "miniprogram-api-typings": {
+      "version": "3.4.3",
+      "resolved": "https://registry.nlark.com/miniprogram-api-typings/download/miniprogram-api-typings-3.4.3.tgz?cache=0&sync_timestamp=1629802855673&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fminiprogram-api-typings%2Fdownload%2Fminiprogram-api-typings-3.4.3.tgz",
+      "integrity": "sha1-yIzGJJczItmQNT2UrnZduQk40TI=",
+      "dev": true
+    },
+    "mississippi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz",
+      "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=",
+      "requires": {
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^3.0.0",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz",
+      "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=",
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz",
+      "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "module-alias": {
+      "version": "2.2.2",
+      "resolved": "https://registry.nlark.com/module-alias/download/module-alias-2.2.2.tgz",
+      "integrity": "sha1-FRzc7MJOJXOf8KpuUeHFcWl0wOA="
+    },
+    "moment": {
+      "version": "2.30.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+      "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "requires": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      }
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.nlark.com/ms/download/ms-2.1.2.tgz",
+      "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.nlark.com/multicast-dns/download/multicast-dns-6.2.3.tgz",
+      "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=",
+      "dev": true,
+      "requires": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "dev": true
+    },
+    "mustache": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+      "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
+      "dev": true
+    },
+    "mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz",
+      "integrity": "sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "nan": {
+      "version": "2.15.0",
+      "resolved": "https://registry.nlark.com/nan/download/nan-2.15.0.tgz",
+      "integrity": "sha1-PzSkc/8Y4VwbVia2KQO1rW5mX+4="
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz",
+      "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=",
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz",
+      "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs="
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz",
+      "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8="
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz?cache=0&sync_timestamp=1614510039289&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnice-try%2Fdownload%2Fnice-try-1.0.5.tgz",
+      "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=",
+      "dev": true
+    },
+    "no-case": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz?cache=0&sync_timestamp=1606867284055&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-2.3.2.tgz",
+      "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=",
+      "dev": true,
+      "requires": {
+        "lower-case": "^1.1.1"
+      }
+    },
+    "node-forge": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.10.0.tgz",
+      "integrity": "sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M=",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+      "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+      "requires": {
+        "fstream": "^1.0.0",
+        "glob": "^7.0.3",
+        "graceful-fs": "^4.1.2",
+        "mkdirp": "^0.5.0",
+        "nopt": "2 || 3",
+        "npmlog": "0 || 1 || 2 || 3 || 4",
+        "osenv": "0",
+        "request": "^2.87.0",
+        "rimraf": "2",
+        "semver": "~5.3.0",
+        "tar": "^2.0.0",
+        "which": "1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw=="
+        }
+      }
+    },
+    "node-int64": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+      "dev": true
+    },
+    "node-ipc": {
+      "version": "9.2.1",
+      "resolved": "https://registry.nlark.com/node-ipc/download/node-ipc-9.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-ipc%2Fdownload%2Fnode-ipc-9.2.1.tgz",
+      "integrity": "sha1-sy9mEV+dbOhB3E7CAJ1qcz+Yu2s=",
+      "dev": true,
+      "requires": {
+        "event-pubsub": "4.3.0",
+        "js-message": "1.0.7",
+        "js-queue": "2.0.2"
+      }
+    },
+    "node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=",
+      "requires": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+        }
+      }
+    },
+    "node-notifier": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz",
+      "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "growly": "^1.3.0",
+        "is-wsl": "^2.1.1",
+        "semver": "^6.3.0",
+        "shellwords": "^0.1.1",
+        "which": "^1.3.1"
+      },
+      "dependencies": {
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "node-releases": {
+      "version": "1.1.75",
+      "resolved": "https://registry.nlark.com/node-releases/download/node-releases-1.1.75.tgz",
+      "integrity": "sha1-bdjIdrmJehuOWgLeJq+nm7VOu/4="
+    },
+    "node-sass": {
+      "version": "4.14.1",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
+      "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
+      "requires": {
+        "async-foreach": "^0.1.3",
+        "chalk": "^1.1.1",
+        "cross-spawn": "^3.0.0",
+        "gaze": "^1.0.0",
+        "get-stdin": "^4.0.1",
+        "glob": "^7.0.3",
+        "in-publish": "^2.0.0",
+        "lodash": "^4.17.15",
+        "meow": "^3.7.0",
+        "mkdirp": "^0.5.1",
+        "nan": "^2.13.2",
+        "node-gyp": "^3.8.0",
+        "npmlog": "^4.0.0",
+        "request": "^2.88.0",
+        "sass-graph": "2.2.5",
+        "stdout-stream": "^1.4.0",
+        "true-case-path": "^1.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+          "integrity": "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==",
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "which": "^1.2.9"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="
+        }
+      }
+    },
+    "nopt": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+      "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
+      "requires": {
+        "abbrev": "1"
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=",
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz",
+      "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU="
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true
+    },
+    "normalize-url": {
+      "version": "3.3.0",
+      "resolved": "https://registry.nlark.com/normalize-url/download/normalize-url-3.3.0.tgz?cache=0&sync_timestamp=1628689099559&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-url%2Fdownload%2Fnormalize-url-3.3.0.tgz",
+      "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "requires": {
+        "are-we-there-yet": "~1.1.2",
+        "console-control-strings": "~1.1.0",
+        "gauge": "~2.7.3",
+        "set-blocking": "~2.0.0"
+      }
+    },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz?cache=0&sync_timestamp=1606860690670&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnth-check%2Fdownload%2Fnth-check-1.0.2.tgz",
+      "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.0.0"
+      }
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+      "dev": true
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="
+    },
+    "nwsapi": {
+      "version": "2.2.9",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz",
+      "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz",
+      "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU="
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz?cache=0&sync_timestamp=1602657128410&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-inspect": {
+      "version": "1.11.0",
+      "resolved": "https://registry.nlark.com/object-inspect/download/object-inspect-1.11.0.tgz",
+      "integrity": "sha1-nc6xRs7dQUig2eUauI00z1CZIrE=",
+      "dev": true
+    },
+    "object-is": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.1.5.tgz?cache=0&sync_timestamp=1613857698573&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.1.5.tgz",
+      "integrity": "sha1-ud7qpfx/GEag+uzc7sE45XePU6w=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz",
+      "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4="
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.assign": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115183005&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz",
+      "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=",
+      "requires": {
+        "call-bind": "^1.0.0",
+        "define-properties": "^1.1.3",
+        "has-symbols": "^1.0.1",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "object.getownpropertydescriptors": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.2.tgz",
+      "integrity": "sha1-G9Y66s8NXS0vMbXjk7A6fGAaI/c=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.2"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.values": {
+      "version": "1.1.4",
+      "resolved": "https://registry.nlark.com/object.values/download/object.values-1.1.4.tgz?cache=0&sync_timestamp=1622071658027&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fobject.values%2Fdownload%2Fobject.values-1.1.4.tgz",
+      "integrity": "sha1-DSc3YoM+gWtpOmN9MAc+cFFTWzA=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.2"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz",
+      "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=",
+      "dev": true
+    },
+    "omggif": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
+      "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz",
+      "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz?cache=0&sync_timestamp=1617889786861&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^1.0.0"
+      }
+    },
+    "only": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
+      "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ=="
+    },
+    "open": {
+      "version": "6.4.0",
+      "resolved": "https://registry.nlark.com/open/download/open-6.4.0.tgz?cache=0&sync_timestamp=1624208993482&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fopen%2Fdownload%2Fopen-6.4.0.tgz",
+      "integrity": "sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk=",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "opener": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npm.taobao.org/opener/download/opener-1.5.2.tgz",
+      "integrity": "sha1-XTfh81B3udysQwE3InGv3rKhNZg=",
+      "dev": true
+    },
+    "opn": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz",
+      "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=",
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz",
+      "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=",
+      "requires": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
+      }
+    },
+    "ora": {
+      "version": "3.4.0",
+      "resolved": "https://registry.nlark.com/ora/download/ora-3.4.0.tgz?cache=0&sync_timestamp=1629755504079&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fora%2Fdownload%2Fora-3.4.0.tgz",
+      "integrity": "sha1-vwdSSRBZo+8+1MhQl1Md6f280xg=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "cli-cursor": "^2.1.0",
+        "cli-spinners": "^2.0.0",
+        "log-symbols": "^2.2.0",
+        "strip-ansi": "^5.2.0",
+        "wcwidth": "^1.0.1"
+      },
+      "dependencies": {
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
+          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz",
+      "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=",
+      "dev": true,
+      "requires": {
+        "url-parse": "^1.4.3"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ=="
+    },
+    "os-locale-s-fix": {
+      "version": "1.0.8-fix-1",
+      "resolved": "https://registry.npmjs.org/os-locale-s-fix/-/os-locale-s-fix-1.0.8-fix-1.tgz",
+      "integrity": "sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==",
+      "dev": true,
+      "requires": {
+        "lcid": "^3.0.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+      "requires": {
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.0"
+      }
+    },
+    "p-each-series": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
+      "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.nlark.com/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1628812721654&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz",
+      "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/p-locate/download/p-locate-3.0.0.tgz?cache=0&sync_timestamp=1629892708584&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-3.0.0.tgz",
+      "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=",
+      "requires": {
+        "p-limit": "^2.0.0"
+      }
+    },
+    "p-map": {
+      "version": "2.1.0",
+      "resolved": "https://registry.nlark.com/p-map/download/p-map-2.1.0.tgz?cache=0&sync_timestamp=1627082385032&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-map%2Fdownload%2Fp-map-2.1.0.tgz",
+      "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=",
+      "dev": true
+    },
+    "p-retry": {
+      "version": "3.0.1",
+      "resolved": "https://registry.nlark.com/p-retry/download/p-retry-3.0.1.tgz",
+      "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=",
+      "dev": true,
+      "requires": {
+        "retry": "^0.12.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz",
+      "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY="
+    },
+    "pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.nlark.com/pako/download/pako-1.0.11.tgz?cache=0&sync_timestamp=1627560187062&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpako%2Fdownload%2Fpako-1.0.11.tgz",
+      "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8="
+    },
+    "parallel-transform": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz",
+      "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=",
+      "requires": {
+        "cyclist": "^1.0.1",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "param-case": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz?cache=0&sync_timestamp=1606867311360&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparam-case%2Fdownload%2Fparam-case-2.1.1.tgz",
+      "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+      "dev": true,
+      "requires": {
+        "no-case": "^2.2.0"
+      }
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+          "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.6.tgz?cache=0&sync_timestamp=1597167448404&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-asn1%2Fdownload%2Fparse-asn1-5.1.6.tgz",
+      "integrity": "sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ=",
+      "requires": {
+        "asn1.js": "^5.2.0",
+        "browserify-aes": "^1.0.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-bmfont-ascii": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
+      "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==",
+      "dev": true
+    },
+    "parse-bmfont-binary": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
+      "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==",
+      "dev": true
+    },
+    "parse-bmfont-xml": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz",
+      "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==",
+      "dev": true,
+      "requires": {
+        "xml-parse-from-string": "^1.0.0",
+        "xml2js": "^0.5.0"
+      }
+    },
+    "parse-headers": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
+      "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==",
+      "dev": true
+    },
+    "parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.2.0.tgz?cache=0&sync_timestamp=1610966667117&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-5.2.0.tgz",
+      "integrity": "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      }
+    },
+    "parse5": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.1.tgz",
+      "integrity": "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg=",
+      "dev": true
+    },
+    "parse5-htmlparser2-tree-adapter": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npm.taobao.org/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+      "integrity": "sha1-LN+a2CMyEUA3DU2/XT6Sx8jdxuY=",
+      "dev": true,
+      "requires": {
+        "parse5": "^6.0.1"
+      },
+      "dependencies": {
+        "parse5": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-6.0.1.tgz",
+          "integrity": "sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws=",
+          "dev": true
+        }
+      }
+    },
+    "parseqs": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
+      "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
+    },
+    "parseuri": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
+      "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz",
+      "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ="
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+    },
+    "path-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz",
+      "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo="
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz?cache=0&sync_timestamp=1617971691339&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz",
+      "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU="
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz",
+      "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=",
+      "dev": true,
+      "requires": {
+        "pify": "^3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
+    },
+    "pbkdf2": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.2.tgz",
+      "integrity": "sha1-3YIqoIh1gOUvGgOdw+2hCO+uMHU=",
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+    },
+    "phin": {
+      "version": "2.9.3",
+      "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
+      "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==",
+      "dev": true
+    },
+    "picomatch": {
+      "version": "2.3.0",
+      "resolved": "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz",
+      "integrity": "sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI="
+    },
+    "pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz",
+      "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE="
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pirates": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="
+    },
+    "pixelmatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
+      "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==",
+      "dev": true,
+      "requires": {
+        "pngjs": "^3.0.0"
+      },
+      "dependencies": {
+        "pngjs": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+          "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+          "dev": true
+        }
+      }
+    },
+    "pkg-dir": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz?cache=0&sync_timestamp=1602858957553&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-3.0.0.tgz",
+      "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=",
+      "requires": {
+        "find-up": "^3.0.0"
+      }
+    },
+    "pn": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
+      "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
+      "dev": true
+    },
+    "pngjs": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="
+    },
+    "pnp-webpack-plugin": {
+      "version": "1.7.0",
+      "resolved": "https://registry.nlark.com/pnp-webpack-plugin/download/pnp-webpack-plugin-1.7.0.tgz",
+      "integrity": "sha1-ZXQThPbYBW824iVajWf/wghm9ck=",
+      "dev": true,
+      "requires": {
+        "ts-pnp": "^1.1.6"
+      }
+    },
+    "portfinder": {
+      "version": "1.0.28",
+      "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.28.tgz",
+      "integrity": "sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g=",
+      "requires": {
+        "async": "^2.6.2",
+        "debug": "^3.1.1",
+        "mkdirp": "^0.5.5"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.nlark.com/debug/download/debug-3.2.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz",
+          "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+    },
+    "postcss": {
+      "version": "7.0.36",
+      "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz?cache=0&sync_timestamp=1626909106325&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss%2Fdownload%2Fpostcss-7.0.36.tgz",
+      "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=",
+      "requires": {
+        "chalk": "^2.4.2",
+        "source-map": "^0.6.1",
+        "supports-color": "^6.1.0"
+      }
+    },
+    "postcss-calc": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.5.tgz?cache=0&sync_timestamp=1609689191682&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-calc%2Fdownload%2Fpostcss-calc-7.0.5.tgz",
+      "integrity": "sha1-+KbpnxLmGcLrwjz2xIb9wVhgkz4=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.27",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.0.2"
+      },
+      "dependencies": {
+        "cssesc": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz",
+          "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=",
+          "dev": true
+        },
+        "postcss-selector-parser": {
+          "version": "6.0.6",
+          "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-6.0.6.tgz?cache=0&sync_timestamp=1620752924836&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.6.tgz",
+          "integrity": "sha1-LFu6gXSsL2mBq2MaQqsO5UrzMuo=",
+          "dev": true,
+          "requires": {
+            "cssesc": "^3.0.0",
+            "util-deprecate": "^1.0.2"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz",
+          "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=",
+          "dev": true
+        }
+      }
+    },
+    "postcss-colormin": {
+      "version": "4.0.3",
+      "resolved": "https://registry.nlark.com/postcss-colormin/download/postcss-colormin-4.0.3.tgz",
+      "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "color": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-comment": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/postcss-comment/download/postcss-comment-2.0.0.tgz",
+      "integrity": "sha1-bIgI5kzuJcMxRlGKioKUSwXxHm8=",
+      "dev": true,
+      "requires": {
+        "postcss": "^6.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.nlark.com/postcss/download/postcss-6.0.23.tgz?cache=0&sync_timestamp=1626909106325&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss%2Fdownload%2Fpostcss-6.0.23.tgz",
+          "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz",
+      "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-helpers": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/postcss-helpers/-/postcss-helpers-0.3.3.tgz",
+      "integrity": "sha512-VumiUcrpbxGlTBNQj6fUOkb/HNRUk/xYz8bNlhgVOdvk3yWEy4B+0nlDUZZM9mTVZ5bJoxUy7WT6z/4E7oMTgw==",
+      "dev": true,
+      "requires": {
+        "urijs": "^1.18.12"
+      }
+    },
+    "postcss-import": {
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz",
+      "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "postcss-value-parser": "^3.2.3",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      }
+    },
+    "postcss-load-config": {
+      "version": "2.1.2",
+      "resolved": "https://registry.nlark.com/postcss-load-config/download/postcss-load-config-2.1.2.tgz",
+      "integrity": "sha1-xepQTyxK7zPHNZo03jVzdyrXUCo=",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "import-cwd": "^2.0.0"
+      }
+    },
+    "postcss-loader": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/postcss-loader/download/postcss-loader-3.0.0.tgz?cache=0&sync_timestamp=1625142952652&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-loader%2Fdownload%2Fpostcss-loader-3.0.0.tgz",
+      "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "postcss": "^7.0.0",
+        "postcss-load-config": "^2.0.0",
+        "schema-utils": "^1.0.0"
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "https://registry.nlark.com/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=",
+      "dev": true,
+      "requires": {
+        "css-color-names": "0.0.4",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "stylehacks": "^4.0.0"
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "4.0.3",
+      "resolved": "https://registry.nlark.com/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz?cache=0&sync_timestamp=1622234681019&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-merge-rules%2Fdownload%2Fpostcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "cssnano-util-same-parent": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0",
+        "vendors": "^1.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&sync_timestamp=1620752924836&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-minify-font-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "is-color-stop": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-minify-params": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "browserslist": "^4.0.0",
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&sync_timestamp=1620752924836&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-modules-extract-imports": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz?cache=0&sync_timestamp=1602588260997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-extract-imports%2Fdownload%2Fpostcss-modules-extract-imports-2.0.0.tgz",
+      "integrity": "sha1-gYcZoa4doyX5gyRGsBE27rSTzX4=",
+      "requires": {
+        "postcss": "^7.0.5"
+      }
+    },
+    "postcss-modules-local-by-default": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.3.tgz?cache=0&sync_timestamp=1602587625149&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-3.0.3.tgz",
+      "integrity": "sha1-uxTgzHgnnVBNvcv9fgyiiZP/u7A=",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.1.1",
+        "postcss": "^7.0.32",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "dependencies": {
+        "cssesc": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz",
+          "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=",
+          "dev": true
+        },
+        "postcss-selector-parser": {
+          "version": "6.0.6",
+          "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-6.0.6.tgz?cache=0&sync_timestamp=1620752924836&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.6.tgz",
+          "integrity": "sha1-LFu6gXSsL2mBq2MaQqsO5UrzMuo=",
+          "dev": true,
+          "requires": {
+            "cssesc": "^3.0.0",
+            "util-deprecate": "^1.0.2"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz",
+          "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=",
+          "dev": true
+        }
+      }
+    },
+    "postcss-modules-scope": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-2.2.0.tgz",
+      "integrity": "sha1-OFyuATzHdD9afXYC0Qc6iequYu4=",
+      "requires": {
+        "postcss": "^7.0.6",
+        "postcss-selector-parser": "^6.0.0"
+      },
+      "dependencies": {
+        "cssesc": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz",
+          "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4="
+        },
+        "postcss-selector-parser": {
+          "version": "6.0.6",
+          "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-6.0.6.tgz?cache=0&sync_timestamp=1620752924836&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.6.tgz",
+          "integrity": "sha1-LFu6gXSsL2mBq2MaQqsO5UrzMuo=",
+          "requires": {
+            "cssesc": "^3.0.0",
+            "util-deprecate": "^1.0.2"
+          }
+        }
+      }
+    },
+    "postcss-modules-values": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz?cache=0&sync_timestamp=1602586215124&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-3.0.0.tgz",
+      "integrity": "sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA=",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.0.0",
+        "postcss": "^7.0.6"
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o=",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-positions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8=",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-repeat-style": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw=",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-string": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw=",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-timing-functions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha1-jgCcoqOUnNr4rSPmtquZy159KNk=",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-unicode": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=",
+      "dev": true,
+      "requires": {
+        "is-absolute-url": "^2.0.0",
+        "normalize-url": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-whitespace": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "https://registry.nlark.com/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-ordered-values%2Fdownload%2Fpostcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "4.0.3",
+      "resolved": "https://registry.nlark.com/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "4.0.2",
+      "resolved": "https://registry.nlark.com/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "6.0.16",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+      "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
+      "requires": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      }
+    },
+    "postcss-svgo": {
+      "version": "4.0.3",
+      "resolved": "https://registry.nlark.com/postcss-svgo/download/postcss-svgo-4.0.3.tgz",
+      "integrity": "sha1-NDos26yVBdQWJD1Jb3JPOIlMlB4=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "svgo": "^1.0.0"
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "4.0.1",
+      "resolved": "https://registry.nlark.com/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "postcss-urlrewrite": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/postcss-urlrewrite/-/postcss-urlrewrite-0.2.2.tgz",
+      "integrity": "sha512-DxPSgykgHjoV4Z+ygvq2C5HkiuiKQQD74xpoNQSQuyi8zab9nODVtNKfnCN6BEv9VZrjpOGLGAf8BDvgG6EtHg==",
+      "dev": true,
+      "requires": {
+        "postcss-helpers": "^0.3.2"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz",
+      "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE="
+    },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+    },
+    "prepend-http": {
+      "version": "1.0.4",
+      "resolved": "https://registry.nlark.com/prepend-http/download/prepend-http-1.0.4.tgz?cache=0&sync_timestamp=1628547565904&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprepend-http%2Fdownload%2Fprepend-http-1.0.4.tgz",
+      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+      "dev": true
+    },
+    "prettier": {
+      "version": "1.19.1",
+      "resolved": "https://registry.nlark.com/prettier/download/prettier-1.19.1.tgz?cache=0&sync_timestamp=1624696193562&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprettier%2Fdownload%2Fprettier-1.19.1.tgz",
+      "integrity": "sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=",
+      "optional": true
+    },
+    "pretty-error": {
+      "version": "2.1.2",
+      "resolved": "https://registry.nlark.com/pretty-error/download/pretty-error-2.1.2.tgz",
+      "integrity": "sha1-von4LYGxyG7I/fvDhQRYgnJ/k7Y=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.20",
+        "renderkid": "^2.0.4"
+      }
+    },
+    "pretty-format": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
+      "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "ansi-regex": "^5.0.0",
+        "ansi-styles": "^4.0.0",
+        "react-is": "^16.12.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        }
+      }
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I="
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
+    },
+    "prompts": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+      "dev": true,
+      "requires": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
+      }
+    },
+    "proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz",
+      "integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU=",
+      "dev": true,
+      "requires": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+    },
+    "psl": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz",
+      "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ="
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz",
+      "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=",
+      "requires": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz",
+          "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og="
+        }
+      }
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz",
+      "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=",
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz",
+      "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=",
+      "requires": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      },
+      "dependencies": {
+        "pump": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz",
+          "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=",
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        }
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
+      "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+      "dev": true
+    },
+    "qr-image": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/qr-image/-/qr-image-3.2.0.tgz",
+      "integrity": "sha512-rXKDS5Sx3YipVsqmlMJsJsk6jXylEpiHRC2+nJy66fxA5ExYyGa4PqwteW69SaVmAb2OQ18HbYriT7cGQMbduw=="
+    },
+    "qrcode": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz",
+      "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==",
+      "requires": {
+        "dijkstrajs": "^1.0.1",
+        "encode-utf8": "^1.0.3",
+        "pngjs": "^5.0.0",
+        "yargs": "^15.3.1"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "qrcode-reader": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/qrcode-reader/-/qrcode-reader-1.0.4.tgz",
+      "integrity": "sha512-rRjALGNh9zVqvweg1j5OKIQKNsw3bLC+7qwlnead5K/9cb1cEIAGkwikt/09U0K+2IDWGD9CC6SP7tHAjUeqvQ==",
+      "dev": true
+    },
+    "qrcode-terminal": {
+      "version": "0.12.0",
+      "resolved": "https://registry.nlark.com/qrcode-terminal/download/qrcode-terminal-0.12.0.tgz",
+      "integrity": "sha1-u1tpnvf58FBQkqN0i+RGT+cbWBk="
+    },
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&sync_timestamp=1616385328325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz",
+      "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY="
+    },
+    "query-string": {
+      "version": "4.3.4",
+      "resolved": "https://registry.nlark.com/query-string/download/query-string-4.3.4.tgz",
+      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.1.0",
+        "strict-uri-encode": "^1.0.0"
+      }
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.nlark.com/querystring/download/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+    },
+    "querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/querystringify/download/querystringify-2.2.0.tgz?cache=0&sync_timestamp=1597686663691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquerystringify%2Fdownload%2Fquerystringify-2.2.0.tgz",
+      "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=",
+      "dev": true
+    },
+    "queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz",
+      "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=",
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz",
+      "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=",
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz",
+      "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz",
+      "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=",
+      "requires": {
+        "bytes": "3.1.0",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      }
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "dev": true,
+      "requires": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      }
+    },
+    "react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "dev": true
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+      "dev": true,
+      "requires": {
+        "pify": "^2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "5.2.0",
+      "resolved": "https://registry.nlark.com/read-pkg/download/read-pkg-5.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fread-pkg%2Fdownload%2Fread-pkg-5.2.0.tgz",
+      "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=",
+      "dev": true,
+      "requires": {
+        "@types/normalize-package-data": "^2.4.0",
+        "normalize-package-data": "^2.5.0",
+        "parse-json": "^5.0.0",
+        "type-fest": "^0.6.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+      "dev": true,
+      "requires": {
+        "find-up": "^4.1.0",
+        "read-pkg": "^5.2.0",
+        "type-fest": "^0.8.1"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "dev": true
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz",
+      "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=",
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.6.0.tgz?cache=0&sync_timestamp=1615717369278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.6.0.tgz",
+      "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=",
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "realpath-native": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+      "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
+      "dev": true
+    },
+    "recast": {
+      "version": "0.23.6",
+      "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.6.tgz",
+      "integrity": "sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==",
+      "dev": true,
+      "requires": {
+        "ast-types": "^0.16.1",
+        "esprima": "~4.0.0",
+        "source-map": "~0.6.1",
+        "tiny-invariant": "^1.3.3",
+        "tslib": "^2.0.1"
+      }
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+      "requires": {
+        "resolve": "^1.1.6"
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==",
+      "requires": {
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
+      },
+      "dependencies": {
+        "strip-indent": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+          "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==",
+          "requires": {
+            "get-stdin": "^4.0.1"
+          }
+        }
+      }
+    },
+    "regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.2.tgz?cache=0&sync_timestamp=1604218378158&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate%2Fdownload%2Fregenerate-1.4.2.tgz",
+      "integrity": "sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo="
+    },
+    "regenerate-unicode-properties": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz",
+      "integrity": "sha1-5d5xEdZV57pgwFfb6f83yH5lzew=",
+      "requires": {
+        "regenerate": "^1.4.0"
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.12.1",
+      "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.12.1.tgz?cache=0&sync_timestamp=1626993001371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.12.1.tgz",
+      "integrity": "sha1-+hpxVEdkwDb4xJsToIsllMn4oN4="
+    },
+    "regenerator-transform": {
+      "version": "0.14.5",
+      "resolved": "https://registry.nlark.com/regenerator-transform/download/regenerator-transform-0.14.5.tgz?cache=0&sync_timestamp=1627057533376&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.5.tgz",
+      "integrity": "sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=",
+      "requires": {
+        "@babel/runtime": "^7.8.4"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz",
+      "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "regexp.prototype.flags": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.1.tgz?cache=0&sync_timestamp=1610725679574&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexp.prototype.flags%2Fdownload%2Fregexp.prototype.flags-1.3.1.tgz",
+      "integrity": "sha1-fvNSro0VnnWMDq3Kb4/LTu8HviY=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "regexpu-core": {
+      "version": "4.7.1",
+      "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.7.1.tgz",
+      "integrity": "sha1-LepamgcjMpj78NuR+pq8TG4PitY=",
+      "requires": {
+        "regenerate": "^1.4.0",
+        "regenerate-unicode-properties": "^8.2.0",
+        "regjsgen": "^0.5.1",
+        "regjsparser": "^0.6.4",
+        "unicode-match-property-ecmascript": "^1.0.4",
+        "unicode-match-property-value-ecmascript": "^1.2.0"
+      }
+    },
+    "registry-auth-token": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+      "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+      "dev": true,
+      "requires": {
+        "rc": "^1.1.6",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "registry-url": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+      "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==",
+      "dev": true,
+      "requires": {
+        "rc": "^1.0.1"
+      }
+    },
+    "regjsgen": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.2.tgz",
+      "integrity": "sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM="
+    },
+    "regjsparser": {
+      "version": "0.6.9",
+      "resolved": "https://registry.nlark.com/regjsparser/download/regjsparser-0.6.9.tgz",
+      "integrity": "sha1-tInu98mizkNydicBFCnPgzpxg+Y=",
+      "requires": {
+        "jsesc": "~0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz?cache=0&sync_timestamp=1603891242793&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+        }
+      }
+    },
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+      "dev": true
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+    },
+    "renderkid": {
+      "version": "2.0.7",
+      "resolved": "https://registry.nlark.com/renderkid/download/renderkid-2.0.7.tgz?cache=0&sync_timestamp=1623343447049&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frenderkid%2Fdownload%2Frenderkid-2.0.7.tgz",
+      "integrity": "sha1-Rk8namvc7mBvShWZP5sp/HTKhgk=",
+      "dev": true,
+      "requires": {
+        "css-select": "^4.1.3",
+        "dom-converter": "^0.2.0",
+        "htmlparser2": "^6.1.0",
+        "lodash": "^4.17.21",
+        "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "css-select": {
+          "version": "4.1.3",
+          "resolved": "https://registry.nlark.com/css-select/download/css-select-4.1.3.tgz",
+          "integrity": "sha1-pwRA9wMX8maRGK10/xBeZYSccGc=",
+          "dev": true,
+          "requires": {
+            "boolbase": "^1.0.0",
+            "css-what": "^5.0.0",
+            "domhandler": "^4.2.0",
+            "domutils": "^2.6.0",
+            "nth-check": "^2.0.0"
+          }
+        },
+        "css-what": {
+          "version": "5.0.1",
+          "resolved": "https://registry.nlark.com/css-what/download/css-what-5.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-what%2Fdownload%2Fcss-what-5.0.1.tgz",
+          "integrity": "sha1-PvqCATH0ZpqKwkCPnDLnx96fTK0=",
+          "dev": true
+        },
+        "dom-serializer": {
+          "version": "1.3.2",
+          "resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256858583&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz",
+          "integrity": "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "domhandler": "^4.2.0",
+            "entities": "^2.0.0"
+          }
+        },
+        "domelementtype": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz",
+          "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=",
+          "dev": true
+        },
+        "domutils": {
+          "version": "2.8.0",
+          "resolved": "https://registry.nlark.com/domutils/download/domutils-2.8.0.tgz?cache=0&sync_timestamp=1630106535879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-2.8.0.tgz",
+          "integrity": "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "^1.0.1",
+            "domelementtype": "^2.2.0",
+            "domhandler": "^4.2.0"
+          }
+        },
+        "nth-check": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-2.0.0.tgz?cache=0&sync_timestamp=1606860690670&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnth-check%2Fdownload%2Fnth-check-2.0.0.tgz",
+          "integrity": "sha1-G7T22scAcvwxPoyc0UF7UHTAoSU=",
+          "dev": true,
+          "requires": {
+            "boolbase": "^1.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "repeat-element": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.4.tgz?cache=0&sync_timestamp=1617837642601&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frepeat-element%2Fdownload%2Frepeat-element-1.1.4.tgz",
+      "integrity": "sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek="
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==",
+      "requires": {
+        "is-finite": "^1.0.0"
+      }
+    },
+    "request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz",
+      "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=",
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "request-promise-core": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+      "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.19"
+      }
+    },
+    "request-promise-native": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+      "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
+      "dev": true,
+      "requires": {
+        "request-promise-core": "1.1.4",
+        "stealthy-require": "^1.1.1",
+        "tough-cookie": "^2.3.3"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+    },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz",
+      "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs="
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz?cache=0&sync_timestamp=1613055183799&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.20.0.tgz",
+      "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=",
+      "requires": {
+        "is-core-module": "^2.2.0",
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve-cwd%2Fdownload%2Fresolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "dev": true
+    },
+    "resolve-path": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz",
+      "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==",
+      "requires": {
+        "http-errors": "~1.6.2",
+        "path-is-absolute": "1.0.1"
+      },
+      "dependencies": {
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+        }
+      }
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.nlark.com/restore-cursor/download/restore-cursor-2.0.0.tgz?cache=0&sync_timestamp=1629747087185&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frestore-cursor%2Fdownload%2Frestore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "dev": true,
+      "requires": {
+        "onetime": "^2.0.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz",
+      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w="
+    },
+    "retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.nlark.com/retry/download/retry-0.12.0.tgz",
+      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
+      "dev": true
+    },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
+    "rgb-regex": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/rgb-regex/download/rgb-regex-1.0.1.tgz",
+      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
+      "dev": true
+    },
+    "rgba-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/rgba-regex/download/rgba-regex-1.0.0.tgz",
+      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz",
+      "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=",
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz",
+      "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=",
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "rsvp": {
+      "version": "4.8.5",
+      "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
+      "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
+      "dev": true
+    },
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "requires": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "requires": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "safe-area-insets": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/safe-area-insets/-/safe-area-insets-1.4.1.tgz",
+      "integrity": "sha512-r/nRWTjFGhhm3w1Z6Kd/jY11srN+lHt2mNl1E/emQGW8ic7n3Avu4noibklfSM+Y34peNphHD/BSZecav0sXYQ=="
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
+      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
+      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
+    },
+    "sane": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
+      "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
+      "dev": true,
+      "requires": {
+        "@cnakazawa/watch": "^1.0.3",
+        "anymatch": "^2.0.0",
+        "capture-exit": "^2.0.0",
+        "exec-sh": "^0.3.2",
+        "execa": "^1.0.0",
+        "fb-watchman": "^2.0.0",
+        "micromatch": "^3.1.4",
+        "minimist": "^1.1.1",
+        "walker": "~1.0.5"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          }
+        },
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
+          "dev": true,
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        }
+      }
+    },
+    "sass-graph": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
+      "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
+      "requires": {
+        "glob": "^7.0.0",
+        "lodash": "^4.0.0",
+        "scss-tokenizer": "^0.2.3",
+        "yargs": "^13.3.2"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "sass-loader": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz",
+      "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==",
+      "requires": {
+        "clone-deep": "^4.0.1",
+        "loader-utils": "^1.0.1",
+        "neo-async": "^2.5.0",
+        "pify": "^4.0.1",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
+        }
+      }
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz",
+      "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=",
+      "dev": true
+    },
+    "saxes": {
+      "version": "3.1.11",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
+      "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
+      "dev": true,
+      "requires": {
+        "xmlchars": "^2.1.1"
+      }
+    },
+    "schema-utils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-1.0.0.tgz",
+      "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=",
+      "requires": {
+        "ajv": "^6.1.0",
+        "ajv-errors": "^1.0.0",
+        "ajv-keywords": "^3.1.0"
+      }
+    },
+    "scss-tokenizer": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+      "integrity": "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==",
+      "requires": {
+        "js-base64": "^2.1.8",
+        "source-map": "^0.4.2"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "selfsigned": {
+      "version": "1.10.11",
+      "resolved": "https://registry.nlark.com/selfsigned/download/selfsigned-1.10.11.tgz?cache=0&sync_timestamp=1620160245612&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fselfsigned%2Fdownload%2Fselfsigned-1.10.11.tgz",
+      "integrity": "sha1-JJKc2Qb+D0S20B+yOZmnOVN6y+k=",
+      "dev": true,
+      "requires": {
+        "node-forge": "^0.10.0"
+      }
+    },
+    "semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz",
+      "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc="
+    },
+    "send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz",
+      "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+              "dev": true
+            }
+          }
+        },
+        "mime": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz",
+          "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.nlark.com/ms/download/ms-2.1.1.tgz",
+          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=",
+          "dev": true
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "4.0.0",
+      "resolved": "https://registry.nlark.com/serialize-javascript/download/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao=",
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz",
+          "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=",
+          "dev": true
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz",
+      "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=",
+      "dev": true,
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.nlark.com/set-value/download/set-value-2.0.1.tgz",
+      "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=",
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+    },
+    "setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz",
+      "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM="
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz",
+      "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=",
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.nlark.com/shallow-clone/download/shallow-clone-3.0.1.tgz",
+      "integrity": "sha1-jymBrZJTH1UDWwH7IwdppA4C76M=",
+      "requires": {
+        "kind-of": "^6.0.2"
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.nlark.com/shebang-regex/download/shebang-regex-1.0.0.tgz?cache=0&sync_timestamp=1628896304371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "shell-exec": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/shell-exec/-/shell-exec-1.0.2.tgz",
+      "integrity": "sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==",
+      "dev": true
+    },
+    "shell-quote": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npm.taobao.org/shell-quote/download/shell-quote-1.7.2.tgz",
+      "integrity": "sha1-Z6fQLHbJ2iT5nSCAj8re0ODgS+I=",
+      "dev": true
+    },
+    "shelljs": {
+      "version": "0.8.5",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+      "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+      "requires": {
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
+      }
+    },
+    "shellwords": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+      "dev": true,
+      "optional": true
+    },
+    "side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.nlark.com/side-channel/download/side-channel-1.0.4.tgz",
+      "integrity": "sha1-785cj9wQTudRslxY1CkAEfpeos8=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      }
+    },
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz",
+      "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw="
+    },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.3.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz",
+          "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=",
+          "dev": true
+        }
+      }
+    },
+    "sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "dev": true
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz",
+      "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=",
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.nlark.com/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "socket.io": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.5.0.tgz",
+      "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==",
+      "requires": {
+        "debug": "~4.1.0",
+        "engine.io": "~3.6.0",
+        "has-binary2": "~1.0.2",
+        "socket.io-adapter": "~1.1.0",
+        "socket.io-client": "2.5.0",
+        "socket.io-parser": "~3.4.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
+      }
+    },
+    "socket.io-adapter": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
+      "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
+    },
+    "socket.io-client": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz",
+      "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==",
+      "requires": {
+        "backo2": "1.0.2",
+        "component-bind": "1.0.0",
+        "component-emitter": "~1.3.0",
+        "debug": "~3.1.0",
+        "engine.io-client": "~3.5.0",
+        "has-binary2": "~1.0.2",
+        "indexof": "0.0.1",
+        "parseqs": "0.0.6",
+        "parseuri": "0.0.6",
+        "socket.io-parser": "~3.3.0",
+        "to-array": "0.1.4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ=="
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        },
+        "socket.io-parser": {
+          "version": "3.3.3",
+          "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz",
+          "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==",
+          "requires": {
+            "component-emitter": "~1.3.0",
+            "debug": "~3.1.0",
+            "isarray": "2.0.1"
+          }
+        }
+      }
+    },
+    "socket.io-parser": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.3.tgz",
+      "integrity": "sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ==",
+      "requires": {
+        "component-emitter": "1.2.1",
+        "debug": "~4.1.0",
+        "isarray": "2.0.1"
+      },
+      "dependencies": {
+        "component-emitter": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+          "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA=="
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ=="
+        }
+      }
+    },
+    "sockjs": {
+      "version": "0.3.21",
+      "resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.21.tgz",
+      "integrity": "sha1-s0/7mOeWkwtgoM+hGQTWozmn1Bc=",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "^0.11.3",
+        "uuid": "^3.4.0",
+        "websocket-driver": "^0.7.4"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.5.2",
+      "resolved": "https://registry.nlark.com/sockjs-client/download/sockjs-client-1.5.2.tgz",
+      "integrity": "sha1-S8SMLanOR2nxnccjOWtQ9cEjMKM=",
+      "dev": true,
+      "requires": {
+        "debug": "^3.2.6",
+        "eventsource": "^1.0.7",
+        "faye-websocket": "^0.11.3",
+        "inherits": "^2.0.4",
+        "json3": "^3.3.3",
+        "url-parse": "^1.5.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.nlark.com/debug/download/debug-3.2.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz",
+          "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
+      }
+    },
+    "sort-keys": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz",
+      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "dev": true,
+      "requires": {
+        "is-plain-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "is-plain-obj": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1618600554597&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz",
+          "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+          "dev": true
+        }
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz",
+      "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ="
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+      "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=",
+      "requires": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.5.19",
+      "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.19.tgz",
+      "integrity": "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=",
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.1.tgz?cache=0&sync_timestamp=1612210508484&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-url%2Fdownload%2Fsource-map-url-0.4.1.tgz",
+      "integrity": "sha1-CvZmBadFpaL5HPG7+KevvCg97FY="
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz",
+      "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=",
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0="
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=",
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.10",
+      "resolved": "https://registry.nlark.com/spdx-license-ids/download/spdx-license-ids-3.0.10.tgz",
+      "integrity": "sha1-DZvszN5wA9bGWNSH3UijLwvzAUs="
+    },
+    "spdy": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npm.taobao.org/spdy/download/spdy-4.0.2.tgz",
+      "integrity": "sha1-t09GYgOj7aRSwCSSuR+56EonZ3s=",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      }
+    },
+    "spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz",
+      "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz",
+          "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz",
+      "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz",
+      "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=",
+      "requires": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      }
+    },
+    "ssri": {
+      "version": "6.0.2",
+      "resolved": "https://registry.nlark.com/ssri/download/ssri-6.0.2.tgz",
+      "integrity": "sha1-FXk5E08gRk5zAd26PpD/qPdyisU=",
+      "requires": {
+        "figgy-pudding": "^3.5.1"
+      }
+    },
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npm.taobao.org/stable/download/stable-0.1.8.tgz",
+      "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=",
+      "dev": true
+    },
+    "stack-utils": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz",
+      "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^2.0.0"
+      },
+      "dependencies": {
+        "escape-string-regexp": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+          "dev": true
+        }
+      }
+    },
+    "stackframe": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/stackframe/download/stackframe-1.2.0.tgz",
+      "integrity": "sha1-UkKUktY8YuuYmATBFVLj0i53kwM=",
+      "dev": true
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1609654066899&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+    },
+    "stdout-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+      "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
+      "requires": {
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "stealthy-require": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+      "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==",
+      "dev": true
+    },
+    "stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz",
+      "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=",
+      "requires": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz",
+      "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=",
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.nlark.com/stream-http/download/stream-http-2.8.3.tgz",
+      "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=",
+      "requires": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz",
+      "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0="
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+      "dev": true
+    },
+    "stricter-htmlparser2": {
+      "version": "3.9.6",
+      "resolved": "https://registry.npmjs.org/stricter-htmlparser2/-/stricter-htmlparser2-3.9.6.tgz",
+      "integrity": "sha512-w/PqXYnjfpi49nb3xnsizORItMM53M/jHdCL8Cer0OqO3vRLsNDtRKoHY/IkIuGnH7/TEn23yvlZoQQLt7pdrw==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^1.3.0",
+        "domutils": "^1.5.1",
+        "entities": "^1.1.1",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.2",
+        "x-domhandler": "^2.4.2"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+          "dev": true
+        }
+      }
+    },
+    "string-length": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz",
+      "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==",
+      "dev": true,
+      "requires": {
+        "astral-regex": "^1.0.0",
+        "strip-ansi": "^5.2.0"
+      },
+      "dependencies": {
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz?cache=0&sync_timestamp=1618558856477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-2.1.1.tgz",
+      "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+      "requires": {
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "string.prototype.trimend": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz",
+      "integrity": "sha1-51rpDClCxjUEaGwYsoe0oLGkX4A=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "string.prototype.trimstart": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz?cache=0&sync_timestamp=1614127318238&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.4.tgz",
+      "integrity": "sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0=",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz",
+      "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "requires": {
+        "ansi-regex": "^5.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+        }
+      }
+    },
+    "strip-bom": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+      "dev": true
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.nlark.com/strip-final-newline/download/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.nlark.com/strip-indent/download/strip-indent-2.0.0.tgz",
+      "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+      "dev": true
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+      "dev": true
+    },
+    "stylehacks": {
+      "version": "4.0.3",
+      "resolved": "https://registry.nlark.com/stylehacks/download/stylehacks-4.0.3.tgz",
+      "integrity": "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU=",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&sync_timestamp=1620752924836&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "supports-color": {
+      "version": "6.1.0",
+      "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz",
+      "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=",
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "supports-hyperlinks": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+      "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^4.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "svg-tags": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz",
+      "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+      "dev": true
+    },
+    "svgo": {
+      "version": "1.3.2",
+      "resolved": "https://registry.nlark.com/svgo/download/svgo-1.3.2.tgz?cache=0&sync_timestamp=1630142321382&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsvgo%2Fdownload%2Fsvgo-1.3.2.tgz",
+      "integrity": "sha1-ttxRHAYzRsnkFbgeQ0ARRbltQWc=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "coa": "^2.0.2",
+        "css-select": "^2.0.0",
+        "css-select-base-adapter": "^0.1.1",
+        "css-tree": "1.0.0-alpha.37",
+        "csso": "^4.0.2",
+        "js-yaml": "^3.13.1",
+        "mkdirp": "~0.5.1",
+        "object.values": "^1.1.0",
+        "sax": "~1.2.4",
+        "stable": "^0.1.8",
+        "unquote": "~1.1.1",
+        "util.promisify": "~1.0.0"
+      }
+    },
+    "symbol-tree": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+      "dev": true
+    },
+    "tapable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz?cache=0&sync_timestamp=1607088824436&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftapable%2Fdownload%2Ftapable-1.1.3.tgz",
+      "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I="
+    },
+    "tar": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
+      "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+      "requires": {
+        "block-stream": "*",
+        "fstream": "^1.0.12",
+        "inherits": "2"
+      }
+    },
+    "terminal-link": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "supports-hyperlinks": "^2.0.0"
+      }
+    },
+    "terser": {
+      "version": "4.8.0",
+      "resolved": "https://registry.nlark.com/terser/download/terser-4.8.0.tgz",
+      "integrity": "sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc=",
+      "requires": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "1.4.5",
+      "resolved": "https://registry.nlark.com/terser-webpack-plugin/download/terser-webpack-plugin-1.4.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-1.4.5.tgz",
+      "integrity": "sha1-oheu+uozDnNP+sthIOwfoxLWBAs=",
+      "requires": {
+        "cacache": "^12.0.2",
+        "find-cache-dir": "^2.1.0",
+        "is-wsl": "^1.1.0",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^4.0.0",
+        "source-map": "^0.6.1",
+        "terser": "^4.1.2",
+        "webpack-sources": "^1.4.0",
+        "worker-farm": "^1.7.0"
+      }
+    },
+    "test-exclude": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+      "dev": true,
+      "requires": {
+        "@istanbuljs/schema": "^0.1.2",
+        "glob": "^7.1.4",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npm.taobao.org/thenify/download/thenify-3.3.1.tgz",
+      "integrity": "sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8=",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz",
+      "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+      "dev": true,
+      "requires": {
+        "thenify": ">= 3.1.0 < 4"
+      }
+    },
+    "thread-loader": {
+      "version": "2.1.3",
+      "resolved": "https://registry.nlark.com/thread-loader/download/thread-loader-2.1.3.tgz?cache=0&sync_timestamp=1620664384427&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fthread-loader%2Fdownload%2Fthread-loader-2.1.3.tgz",
+      "integrity": "sha1-y9LBOfwrLebp0o9iKGq3cMGsvdo=",
+      "dev": true,
+      "requires": {
+        "loader-runner": "^2.3.1",
+        "loader-utils": "^1.1.0",
+        "neo-async": "^2.6.0"
+      }
+    },
+    "throat": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+      "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+      "dev": true
+    },
+    "through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz",
+      "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=",
+      "requires": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "thunky": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/thunky/download/thunky-1.1.0.tgz",
+      "integrity": "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30=",
+      "dev": true
+    },
+    "timers-browserify": {
+      "version": "2.0.12",
+      "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.12.tgz?cache=0&sync_timestamp=1603793743551&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftimers-browserify%2Fdownload%2Ftimers-browserify-2.0.12.tgz",
+      "integrity": "sha1-RKRcEfv0B/NPl7zNFXfGUjYbAO4=",
+      "requires": {
+        "setimmediate": "^1.0.4"
+      }
+    },
+    "timm": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz",
+      "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==",
+      "dev": true
+    },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+      "dev": true
+    },
+    "tiny-invariant": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+      "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+      "dev": true
+    },
+    "tinycolor2": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+      "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
+      "dev": true
+    },
+    "tmpl": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+      "dev": true
+    },
+    "to-array": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+      "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A=="
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+    },
+    "to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz?cache=0&sync_timestamp=1628418855671&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fto-fast-properties%2Fdownload%2Fto-fast-properties-2.0.0.tgz",
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz",
+      "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      }
+    },
+    "toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz",
+      "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM="
+    },
+    "toposort": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz",
+      "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
+      "dev": true
+    },
+    "tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz",
+      "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=",
+      "requires": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      }
+    },
+    "tr46": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+      "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw=="
+    },
+    "true-case-path": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+      "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+      "requires": {
+        "glob": "^7.1.2"
+      }
+    },
+    "tryer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/tryer/download/tryer-1.0.1.tgz",
+      "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=",
+      "dev": true
+    },
+    "ts-loader": {
+      "version": "6.2.2",
+      "resolved": "https://registry.nlark.com/ts-loader/download/ts-loader-6.2.2.tgz",
+      "integrity": "sha1-3/o4ebAaGh4KS4XiuEIdwN//HFg=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.3.0",
+        "enhanced-resolve": "^4.0.0",
+        "loader-utils": "^1.0.2",
+        "micromatch": "^4.0.0",
+        "semver": "^6.0.0"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz",
+          "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz",
+          "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz",
+          "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.4",
+          "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.4.tgz?cache=0&sync_timestamp=1618054885525&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-4.0.4.tgz",
+          "integrity": "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.2.3"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz",
+          "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "ts-pnp": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/ts-pnp/download/ts-pnp-1.2.0.tgz",
+      "integrity": "sha1-pQCtCEsHmPHDBxrzkeZZEshrypI=",
+      "dev": true
+    },
+    "tslib": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+      "dev": true
+    },
+    "tslint": {
+      "version": "5.20.1",
+      "resolved": "https://registry.nlark.com/tslint/download/tslint-5.20.1.tgz",
+      "integrity": "sha1-5AHortoBUrxE3QfmFANPP4DGe30=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "builtin-modules": "^1.1.1",
+        "chalk": "^2.3.0",
+        "commander": "^2.12.1",
+        "diff": "^4.0.1",
+        "glob": "^7.1.1",
+        "js-yaml": "^3.13.1",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.1",
+        "resolve": "^1.3.2",
+        "semver": "^5.3.0",
+        "tslib": "^1.8.0",
+        "tsutils": "^2.29.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz",
+          "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=",
+          "dev": true
+        }
+      }
+    },
+    "tsscmp": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
+      "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="
+    },
+    "tsutils": {
+      "version": "2.29.0",
+      "resolved": "https://registry.npm.taobao.org/tsutils/download/tsutils-2.29.0.tgz?cache=0&sync_timestamp=1615138114650&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftsutils%2Fdownload%2Ftsutils-2.29.0.tgz",
+      "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz",
+          "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=",
+          "dev": true
+        }
+      }
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+    },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+      "requires": {
+        "prelude-ls": "~1.1.2"
+      }
+    },
+    "type-detect": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+      "dev": true
+    },
+    "type-fest": {
+      "version": "0.6.0",
+      "resolved": "https://registry.nlark.com/type-fest/download/type-fest-0.6.0.tgz?cache=0&sync_timestamp=1630842470843&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.6.0.tgz",
+      "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=",
+      "dev": true
+    },
+    "type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz",
+      "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=",
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+    },
+    "typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "dev": true,
+      "requires": {
+        "is-typedarray": "^1.0.0"
+      }
+    },
+    "typescript": {
+      "version": "3.9.10",
+      "resolved": "https://registry.nlark.com/typescript/download/typescript-3.9.10.tgz?cache=0&sync_timestamp=1630912742892&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftypescript%2Fdownload%2Ftypescript-3.9.10.tgz",
+      "integrity": "sha1-cPORCselHta+952ngAaQsZv3eLg=",
+      "dev": true
+    },
+    "uglify-js": {
+      "version": "3.4.10",
+      "resolved": "https://registry.nlark.com/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1627379738025&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz",
+      "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=",
+      "dev": true,
+      "requires": {
+        "commander": "~2.19.0",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.19.0",
+          "resolved": "https://registry.nlark.com/commander/download/commander-2.19.0.tgz?cache=0&sync_timestamp=1627358254258&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.19.0.tgz",
+          "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=",
+          "dev": true
+        }
+      }
+    },
+    "unbox-primitive": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/unbox-primitive/download/unbox-primitive-1.0.1.tgz?cache=0&sync_timestamp=1616706302651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funbox-primitive%2Fdownload%2Funbox-primitive-1.0.1.tgz",
+      "integrity": "sha1-CF4hViXsMWJXTciFmr7nilmxRHE=",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has-bigints": "^1.0.1",
+        "has-symbols": "^1.0.2",
+        "which-boxed-primitive": "^1.0.2"
+      }
+    },
+    "uni-read-pages": {
+      "version": "1.0.5",
+      "resolved": "https://registry.nlark.com/uni-read-pages/download/uni-read-pages-1.0.5.tgz",
+      "integrity": "sha1-RSyNyqiXe7rvYAkJvpJsjZcEOHw="
+    },
+    "uni-simple-router": {
+      "version": "2.0.7",
+      "resolved": "https://registry.nlark.com/uni-simple-router/download/uni-simple-router-2.0.7.tgz",
+      "integrity": "sha1-BOC1vmzXM6HsudNaPb6C8n9IIE4="
+    },
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+      "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg="
+    },
+    "unicode-match-property-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz",
+      "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=",
+      "requires": {
+        "unicode-canonical-property-names-ecmascript": "^1.0.4",
+        "unicode-property-aliases-ecmascript": "^1.0.4"
+      }
+    },
+    "unicode-match-property-value-ecmascript": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.2.0.tgz",
+      "integrity": "sha1-DZH2AO7rMJaqlisdb8iIduZOpTE="
+    },
+    "unicode-property-aliases-ecmascript": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.1.0.tgz",
+      "integrity": "sha1-3Vepn2IHvt/0Yoq++5TFDblByPQ="
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz",
+      "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+      "dev": true
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+      "dev": true
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz",
+      "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=",
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz",
+      "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=",
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1603179970052&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz",
+      "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY="
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+    },
+    "unquote": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/unquote/download/unquote-1.1.1.tgz",
+      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+      "dev": true
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz?cache=0&sync_timestamp=1616088539233&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funset-value%2Fdownload%2Funset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+        }
+      }
+    },
+    "upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz?cache=0&sync_timestamp=1604768535464&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupath%2Fdownload%2Fupath-1.2.0.tgz",
+      "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ="
+    },
+    "update-check": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz",
+      "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==",
+      "dev": true,
+      "requires": {
+        "registry-auth-token": "3.3.2",
+        "registry-url": "3.1.0"
+      }
+    },
+    "upper-case": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz?cache=0&sync_timestamp=1606859943902&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupper-case%2Fdownload%2Fupper-case-1.1.3.tgz",
+      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+      "dev": true
+    },
+    "uqrcodejs": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/uqrcodejs/-/uqrcodejs-4.0.7.tgz",
+      "integrity": "sha512-84+aZmD2godCVI+93lxE3YUAPNY8zAJvNA7xRS7R7U+q57KzMDepBSfNCwoRUhWOfR6eHFoAOcHRPwsP6ka1cA=="
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237530009&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz",
+      "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=",
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "urijs": {
+      "version": "1.19.7",
+      "resolved": "https://registry.nlark.com/urijs/download/urijs-1.19.7.tgz",
+      "integrity": "sha1-T1lOWRE5KP6mPADOaI+zlbEWirk="
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+        }
+      }
+    },
+    "url-loader": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npm.taobao.org/url-loader/download/url-loader-2.3.0.tgz",
+      "integrity": "sha1-4OLvZY8APvuMpBsPP/v3a6uIZYs=",
+      "requires": {
+        "loader-utils": "^1.2.3",
+        "mime": "^2.4.4",
+        "schema-utils": "^2.5.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "2.7.1",
+          "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-2.7.1.tgz",
+          "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=",
+          "requires": {
+            "@types/json-schema": "^7.0.5",
+            "ajv": "^6.12.4",
+            "ajv-keywords": "^3.5.2"
+          }
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.5.3",
+      "resolved": "https://registry.nlark.com/url-parse/download/url-parse-1.5.3.tgz",
+      "integrity": "sha1-ccEwPTj7Zjmt4YPCmSyMwGht+GI=",
+      "dev": true,
+      "requires": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz",
+      "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8="
+    },
+    "utf8": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
+      "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
+    },
+    "utif": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz",
+      "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
+      "dev": true,
+      "requires": {
+        "pako": "^1.0.5"
+      }
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.nlark.com/util/download/util-0.11.1.tgz?cache=0&sync_timestamp=1622212943994&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil%2Fdownload%2Futil-0.11.1.tgz",
+      "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=",
+      "requires": {
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil-deprecate%2Fdownload%2Futil-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "util.promisify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.1.tgz?cache=0&sync_timestamp=1610159819836&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.1.tgz",
+      "integrity": "sha1-a693dLgO6w91INi4HQeYKlmruu4=",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.2",
+        "has-symbols": "^1.0.1",
+        "object.getownpropertydescriptors": "^2.1.0"
+      }
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+      "dev": true
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.nlark.com/uuid/download/uuid-3.4.0.tgz",
+      "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4="
+    },
+    "v8-to-istanbul": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz",
+      "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "^2.0.1",
+        "convert-source-map": "^1.6.0",
+        "source-map": "^0.7.3"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.7.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+          "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+          "dev": true
+        }
+      }
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+    },
+    "vendors": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/vendors/download/vendors-1.0.4.tgz?cache=0&sync_timestamp=1615203397897&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvendors%2Fdownload%2Fvendors-1.0.4.tgz",
+      "integrity": "sha1-4rgApT56Kbk1BsPPQRANFsTErY4=",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      },
+      "dependencies": {
+        "core-util-is": {
+          "version": "1.0.2",
+          "resolved": "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.2.tgz?cache=0&sync_timestamp=1630420577662&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcore-util-is%2Fdownload%2Fcore-util-is-1.0.2.tgz",
+          "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+        }
+      }
+    },
+    "vm-browserify": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz",
+      "integrity": "sha1-eGQcSIuObKkadfUR56OzKobl3aA="
+    },
+    "vue": {
+      "version": "2.6.14",
+      "resolved": "https://registry.nlark.com/vue/download/vue-2.6.14.tgz",
+      "integrity": "sha1-5RqlJQJQ1Wmj+606ilpofWA24jU="
+    },
+    "vue-class-component": {
+      "version": "6.3.2",
+      "resolved": "https://registry.npm.taobao.org/vue-class-component/download/vue-class-component-6.3.2.tgz",
+      "integrity": "sha1-5gN+hNHfKvO95PRV5Qyhue7AK+Y="
+    },
+    "vue-hot-reload-api": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz",
+      "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI="
+    },
+    "vue-loader": {
+      "version": "15.9.8",
+      "resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-15.9.8.tgz?cache=0&sync_timestamp=1628666767864&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.8.tgz",
+      "integrity": "sha1-Sw9gKvr2aplr4eU0+5YJ3EqxDmE=",
+      "requires": {
+        "@vue/component-compiler-utils": "^3.1.0",
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.1.0",
+        "vue-hot-reload-api": "^2.3.0",
+        "vue-style-loader": "^4.1.0"
+      }
+    },
+    "vue-property-decorator": {
+      "version": "8.5.1",
+      "resolved": "https://registry.nlark.com/vue-property-decorator/download/vue-property-decorator-8.5.1.tgz",
+      "integrity": "sha1-VxqRz40rUH9TfXm/gnWvMYRXL/8=",
+      "requires": {
+        "vue-class-component": "^7.1.0"
+      },
+      "dependencies": {
+        "vue-class-component": {
+          "version": "7.2.6",
+          "resolved": "https://registry.npm.taobao.org/vue-class-component/download/vue-class-component-7.2.6.tgz",
+          "integrity": "sha1-hHHgN7jkdi9aRkaG4Z5a/HCFAuQ="
+        }
+      }
+    },
+    "vue-style-loader": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.3.tgz?cache=0&sync_timestamp=1614758618345&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-style-loader%2Fdownload%2Fvue-style-loader-4.1.3.tgz",
+      "integrity": "sha1-bVWGOlH6dXqyTonZNxRlByqnvDU=",
+      "requires": {
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.0.2"
+      }
+    },
+    "vue-template-compiler": {
+      "version": "2.6.14",
+      "resolved": "https://registry.nlark.com/vue-template-compiler/download/vue-template-compiler-2.6.14.tgz?cache=0&sync_timestamp=1623059845318&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-template-compiler%2Fdownload%2Fvue-template-compiler-2.6.14.tgz",
+      "integrity": "sha1-ovDn2YVnDULJye4NBE/tdpD092M=",
+      "requires": {
+        "de-indent": "^1.0.2",
+        "he": "^1.1.0"
+      }
+    },
+    "vue-template-es2015-compiler": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz",
+      "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU="
+    },
+    "vuex": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
+      "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
+    },
+    "vuex-class": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npm.taobao.org/vuex-class/download/vuex-class-0.3.2.tgz",
+      "integrity": "sha1-x+lqB2wWghN9TSOo3P3GPyIOF6g="
+    },
+    "w3c-hr-time": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+      "dev": true,
+      "requires": {
+        "browser-process-hrtime": "^1.0.0"
+      }
+    },
+    "w3c-xmlserializer": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
+      "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
+      "dev": true,
+      "requires": {
+        "domexception": "^1.0.1",
+        "webidl-conversions": "^4.0.2",
+        "xml-name-validator": "^3.0.0"
+      }
+    },
+    "walker": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+      "dev": true,
+      "requires": {
+        "makeerror": "1.0.12"
+      }
+    },
+    "watchpack": {
+      "version": "1.7.5",
+      "resolved": "https://registry.nlark.com/watchpack/download/watchpack-1.7.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwatchpack%2Fdownload%2Fwatchpack-1.7.5.tgz",
+      "integrity": "sha1-EmfmxV4Lm1vkTCAjrtVDeiwmxFM=",
+      "requires": {
+        "chokidar": "^3.4.1",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0",
+        "watchpack-chokidar2": "^2.0.1"
+      }
+    },
+    "watchpack-chokidar2": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.1.tgz?cache=0&sync_timestamp=1604989128919&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack-chokidar2%2Fdownload%2Fwatchpack-chokidar2-2.0.1.tgz",
+      "integrity": "sha1-OFAAcu5uzmbzdpk2lQ6hdxvhyVc=",
+      "optional": true,
+      "requires": {
+        "chokidar": "^2.1.8"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz",
+          "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
+          "optional": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz",
+              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+              "optional": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
+          }
+        },
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1610299322955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz",
+          "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=",
+          "optional": true
+        },
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.nlark.com/chokidar/download/chokidar-2.1.8.tgz",
+          "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=",
+          "optional": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.3",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "normalize-path": "^3.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.2.1",
+            "upath": "^1.1.1"
+          }
+        },
+        "fsevents": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1612536422255&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz",
+          "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=",
+          "optional": true,
+          "requires": {
+            "bindings": "^1.5.0",
+            "nan": "^2.12.1"
+          }
+        },
+        "is-binary-path": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz",
+          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+          "optional": true,
+          "requires": {
+            "binary-extensions": "^1.0.0"
+          }
+        },
+        "readdirp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1615717369278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz",
+          "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
+          "optional": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "micromatch": "^3.1.10",
+            "readable-stream": "^2.0.2"
+          }
+        }
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz",
+      "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz",
+      "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+      "dev": true,
+      "requires": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "webidl-conversions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+      "dev": true
+    },
+    "webpack": {
+      "version": "4.46.0",
+      "resolved": "https://registry.nlark.com/webpack/download/webpack-4.46.0.tgz?cache=0&sync_timestamp=1630683008873&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwebpack%2Fdownload%2Fwebpack-4.46.0.tgz",
+      "integrity": "sha1-v5tEBOogoHNgXgoBHRiNd8tq1UI=",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/wasm-edit": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "acorn": "^6.4.1",
+        "ajv": "^6.10.2",
+        "ajv-keywords": "^3.4.1",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^4.5.0",
+        "eslint-scope": "^4.0.3",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.4.0",
+        "loader-utils": "^1.2.3",
+        "memory-fs": "^0.4.1",
+        "micromatch": "^3.1.10",
+        "mkdirp": "^0.5.3",
+        "neo-async": "^2.6.1",
+        "node-libs-browser": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "tapable": "^1.1.3",
+        "terser-webpack-plugin": "^1.4.3",
+        "watchpack": "^1.7.4",
+        "webpack-sources": "^1.4.1"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.4.2",
+          "resolved": "https://registry.nlark.com/acorn/download/acorn-6.4.2.tgz",
+          "integrity": "sha1-NYZv1xBSjpLeEM8GAWSY5H454eY="
+        }
+      }
+    },
+    "webpack-bundle-analyzer": {
+      "version": "3.9.0",
+      "resolved": "https://registry.nlark.com/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.9.0.tgz",
+      "integrity": "sha1-9vlNsQj7V05BWtMT3kGicH0z7zw=",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.1.1",
+        "acorn-walk": "^7.1.1",
+        "bfj": "^6.1.1",
+        "chalk": "^2.4.1",
+        "commander": "^2.18.0",
+        "ejs": "^2.6.1",
+        "express": "^4.16.3",
+        "filesize": "^3.6.1",
+        "gzip-size": "^5.0.0",
+        "lodash": "^4.17.19",
+        "mkdirp": "^0.5.1",
+        "opener": "^1.5.1",
+        "ws": "^6.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz",
+          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
+          "dev": true
+        }
+      }
+    },
+    "webpack-chain": {
+      "version": "6.5.1",
+      "resolved": "https://registry.npm.taobao.org/webpack-chain/download/webpack-chain-6.5.1.tgz?cache=0&sync_timestamp=1595813200961&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-chain%2Fdownload%2Fwebpack-chain-6.5.1.tgz",
+      "integrity": "sha1-TycoTLu2N+PI+970Pu9YjU2GEgY=",
+      "dev": true,
+      "requires": {
+        "deepmerge": "^1.5.2",
+        "javascript-stringify": "^2.0.1"
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "3.7.3",
+      "resolved": "https://registry.nlark.com/webpack-dev-middleware/download/webpack-dev-middleware-3.7.3.tgz",
+      "integrity": "sha1-Bjk3KxQyYuK4SrldO5GnWXBhwsU=",
+      "dev": true,
+      "requires": {
+        "memory-fs": "^0.4.1",
+        "mime": "^2.4.4",
+        "mkdirp": "^0.5.1",
+        "range-parser": "^1.2.1",
+        "webpack-log": "^2.0.0"
+      }
+    },
+    "webpack-dev-server": {
+      "version": "3.11.2",
+      "resolved": "https://registry.nlark.com/webpack-dev-server/download/webpack-dev-server-3.11.2.tgz?cache=0&sync_timestamp=1630431908381&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwebpack-dev-server%2Fdownload%2Fwebpack-dev-server-3.11.2.tgz",
+      "integrity": "sha1-aV687Xakkp8NXef9c/r+GF/jNwg=",
+      "dev": true,
+      "requires": {
+        "ansi-html": "0.0.7",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.1.8",
+        "compression": "^1.7.4",
+        "connect-history-api-fallback": "^1.6.0",
+        "debug": "^4.1.1",
+        "del": "^4.1.1",
+        "express": "^4.17.1",
+        "html-entities": "^1.3.1",
+        "http-proxy-middleware": "0.19.1",
+        "import-local": "^2.0.0",
+        "internal-ip": "^4.3.0",
+        "ip": "^1.1.5",
+        "is-absolute-url": "^3.0.3",
+        "killable": "^1.0.1",
+        "loglevel": "^1.6.8",
+        "opn": "^5.5.0",
+        "p-retry": "^3.0.1",
+        "portfinder": "^1.0.26",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.10.8",
+        "semver": "^6.3.0",
+        "serve-index": "^1.9.1",
+        "sockjs": "^0.3.21",
+        "sockjs-client": "^1.5.0",
+        "spdy": "^4.0.2",
+        "strip-ansi": "^3.0.1",
+        "supports-color": "^6.1.0",
+        "url": "^0.11.0",
+        "webpack-dev-middleware": "^3.7.2",
+        "webpack-log": "^2.0.0",
+        "ws": "^6.2.1",
+        "yargs": "^13.3.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz",
+          "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
+          "dev": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz",
+              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+              "dev": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
+          }
+        },
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1610299322955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz",
+          "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1603921799543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz",
+          "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+          "dev": true
+        },
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.nlark.com/chokidar/download/chokidar-2.1.8.tgz",
+          "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=",
+          "dev": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.3",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "normalize-path": "^3.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.2.1",
+            "upath": "^1.1.1"
+          }
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1604880017635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz",
+          "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz",
+              "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
+              "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz?cache=0&sync_timestamp=1614682725186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-7.0.3.tgz",
+          "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=",
+          "dev": true
+        },
+        "fsevents": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1612536422255&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz",
+          "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "bindings": "^1.5.0",
+            "nan": "^2.12.1"
+          }
+        },
+        "http-proxy-middleware": {
+          "version": "0.19.1",
+          "resolved": "https://registry.nlark.com/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhttp-proxy-middleware%2Fdownload%2Fhttp-proxy-middleware-0.19.1.tgz",
+          "integrity": "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo=",
+          "dev": true,
+          "requires": {
+            "http-proxy": "^1.17.0",
+            "is-glob": "^4.0.0",
+            "lodash": "^4.17.11",
+            "micromatch": "^3.1.10"
+          }
+        },
+        "is-absolute-url": {
+          "version": "3.0.3",
+          "resolved": "https://registry.nlark.com/is-absolute-url/download/is-absolute-url-3.0.3.tgz?cache=0&sync_timestamp=1628691826939&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-absolute-url%2Fdownload%2Fis-absolute-url-3.0.3.tgz",
+          "integrity": "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg=",
+          "dev": true
+        },
+        "is-binary-path": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz",
+          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^1.0.0"
+          }
+        },
+        "readdirp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1615717369278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz",
+          "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "micromatch": "^3.1.10",
+            "readable-stream": "^2.0.2"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz?cache=0&sync_timestamp=1618558856477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-3.1.0.tgz",
+          "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz",
+              "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
+              "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz?cache=0&sync_timestamp=1618558923406&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-5.1.0.tgz",
+          "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz",
+              "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
+              "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.nlark.com/yargs/download/yargs-13.3.2.tgz",
+          "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.nlark.com/yargs-parser/download/yargs-parser-13.1.2.tgz?cache=0&sync_timestamp=1624233275366&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.2.tgz",
+          "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "webpack-log": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz?cache=0&sync_timestamp=1615477439589&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-log%2Fdownload%2Fwebpack-log-2.0.0.tgz",
+      "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^3.0.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "webpack-merge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.nlark.com/webpack-merge/download/webpack-merge-4.2.2.tgz",
+      "integrity": "sha1-onxS6ng9E5iv0gh/VH17nS9DY00=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.15"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.4.3",
+      "resolved": "https://registry.nlark.com/webpack-sources/download/webpack-sources-1.4.3.tgz?cache=0&sync_timestamp=1627898061491&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwebpack-sources%2Fdownload%2Fwebpack-sources-1.4.3.tgz",
+      "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=",
+      "requires": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.4",
+      "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.4.tgz",
+      "integrity": "sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A=",
+      "dev": true,
+      "requires": {
+        "http-parser-js": ">=0.5.1",
+        "safe-buffer": ">=5.1.0",
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha1-f4RzvIOd/YdgituV1+sHUhFXikI=",
+      "dev": true
+    },
+    "whatwg-encoding": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "0.4.24"
+      }
+    },
+    "whatwg-mimetype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+      "dev": true
+    },
+    "whatwg-url": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+      "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+      "dev": true,
+      "requires": {
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^1.0.1",
+        "webidl-conversions": "^4.0.2"
+      }
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz",
+      "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz?cache=0&sync_timestamp=1614855347940&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich-boxed-primitive%2Fdownload%2Fwhich-boxed-primitive-1.0.2.tgz",
+      "integrity": "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=",
+      "dev": true,
+      "requires": {
+        "is-bigint": "^1.0.1",
+        "is-boolean-object": "^1.1.0",
+        "is-number-object": "^1.0.4",
+        "is-string": "^1.0.5",
+        "is-symbol": "^1.0.3"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+    },
+    "wide-align": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+      "requires": {
+        "string-width": "^1.0.2 || 2 || 3 || 4"
+      }
+    },
+    "word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz",
+      "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w="
+    },
+    "worker-farm": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz",
+      "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=",
+      "requires": {
+        "errno": "~0.1.7"
+      }
+    },
+    "worker-rpc": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npm.taobao.org/worker-rpc/download/worker-rpc-0.1.1.tgz",
+      "integrity": "sha1-y1Zb1tcHGo8WZgaGBR6WmtMvVNU=",
+      "dev": true,
+      "requires": {
+        "microevent.ts": "~0.1.1"
+      }
+    },
+    "wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&sync_timestamp=1618558923406&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz",
+      "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz",
+          "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+          "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+          "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.2.tgz?cache=0&sync_timestamp=1618558856477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-4.2.2.tgz",
+          "integrity": "sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU=",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        }
+      }
+    },
+    "wrap-loader": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/wrap-loader/-/wrap-loader-0.2.0.tgz",
+      "integrity": "sha512-Qdhdu7vr2H8dLE2sKySQznOBHXIHbKg7PZ5aqkeBOQHGqxLfcJw/ZlB40j67b1tks9OYqSBCHc+uHtGRCmQYlg==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
+    "ws": {
+      "version": "6.2.2",
+      "resolved": "https://registry.nlark.com/ws/download/ws-6.2.2.tgz?cache=0&sync_timestamp=1630167206236&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fws%2Fdownload%2Fws-6.2.2.tgz",
+      "integrity": "sha1-3Vzb1XqZeZFgl2UtePHMX66gwy4=",
+      "dev": true,
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "x-domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/x-domhandler/-/x-domhandler-2.4.2.tgz",
+      "integrity": "sha512-c+T0p5hsahezbHpahjNpSDKjMMwGwOnG6Iaz8zzSjEBlJM47hakZmNBLNpktZJjuRdopoUMPf7HzcPcTE1G0GQ==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1"
+      }
+    },
+    "xhr": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
+      "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+      "dev": true,
+      "requires": {
+        "global": "~4.4.0",
+        "is-function": "^1.0.1",
+        "parse-headers": "^2.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "xml-name-validator": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+      "dev": true
+    },
+    "xml-parse-from-string": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
+      "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==",
+      "dev": true
+    },
+    "xml2js": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
+      "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
+      "dev": true,
+      "requires": {
+        "sax": ">=0.6.0",
+        "xmlbuilder": "~11.0.0"
+      }
+    },
+    "xmlbuilder": {
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+      "dev": true
+    },
+    "xmlchars": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+      "dev": true
+    },
+    "xmlhttprequest-ssl": {
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz",
+      "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q=="
+    },
+    "xregexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
+      "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
+      "dev": true
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz",
+      "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q="
+    },
+    "y18n": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.3.tgz",
+      "integrity": "sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8="
+    },
+    "yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz",
+      "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0="
+    },
+    "yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+      "dev": true,
+      "optional": true
+    },
+    "yargs": {
+      "version": "16.2.0",
+      "resolved": "https://registry.nlark.com/yargs/download/yargs-16.2.0.tgz",
+      "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=",
+      "dev": true,
+      "requires": {
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "dependencies": {
+        "cliui": {
+          "version": "7.0.4",
+          "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-7.0.4.tgz?cache=0&sync_timestamp=1604880017635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-7.0.4.tgz",
+          "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^7.0.0"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.2.tgz?cache=0&sync_timestamp=1618558856477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-4.2.2.tgz",
+          "integrity": "sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU=",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "y18n": {
+          "version": "5.0.8",
+          "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-5.0.8.tgz",
+          "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=",
+          "dev": true
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "20.2.9",
+      "resolved": "https://registry.nlark.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1624233275366&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz",
+      "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=",
+      "dev": true
+    },
+    "yeast": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+      "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg=="
+    },
+    "ylru": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz",
+      "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA=="
+    },
+    "yorkie": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgz",
+      "integrity": "sha1-kkEZEtQ1IU4SxRwq4Qk+VLa7g9k=",
+      "dev": true,
+      "requires": {
+        "execa": "^0.8.0",
+        "is-ci": "^1.0.10",
+        "normalize-path": "^1.0.0",
+        "strip-indent": "^2.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.8.0",
+          "resolved": "https://registry.nlark.com/execa/download/execa-0.8.0.tgz",
+          "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "dev": true
+        },
+        "normalize-path": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-1.0.0.tgz",
+          "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=",
+          "dev": true
+        }
+      }
+    }
+  }
+}

+ 123 - 0
package.json

@@ -0,0 +1,123 @@
+{
+  "name": "uni-app",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "npm run dev:h5",
+    "build": "npm run build:h5",
+    "build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build",
+    "build:custom": "cross-env NODE_ENV=production uniapp-cli custom",
+    "build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build",
+    "build:mp-360": "cross-env NODE_ENV=production UNI_PLATFORM=mp-360 vue-cli-service uni-build",
+    "build:mp-alipay": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build",
+    "build:mp-baidu": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build",
+    "build:mp-kuaishou": "cross-env NODE_ENV=production UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build",
+    "build:mp-qq": "cross-env NODE_ENV=production UNI_PLATFORM=mp-qq vue-cli-service uni-build",
+    "build:mp-toutiao": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build",
+    "build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
+    "build:quickapp-native": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-native vue-cli-service uni-build",
+    "build:quickapp-webview": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview vue-cli-service uni-build",
+    "build:quickapp-webview-huawei": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build",
+    "build:quickapp-webview-union": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build",
+    "dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch",
+    "dev:custom": "cross-env NODE_ENV=development uniapp-cli custom",
+    "dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve",
+    "dev:mp-360": "cross-env NODE_ENV=development UNI_PLATFORM=mp-360 vue-cli-service uni-build --watch",
+    "dev:mp-alipay": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch",
+    "dev:mp-baidu": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch",
+    "dev:mp-kuaishou": "cross-env NODE_ENV=development UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build --watch",
+    "dev:mp-qq": "cross-env NODE_ENV=development UNI_PLATFORM=mp-qq vue-cli-service uni-build --watch",
+    "dev:mp-toutiao": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch",
+    "dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
+    "dev:quickapp-native": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-native vue-cli-service uni-build --watch",
+    "dev:quickapp-webview": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview vue-cli-service uni-build --watch",
+    "dev:quickapp-webview-huawei": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build --watch",
+    "dev:quickapp-webview-union": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build --watch",
+    "info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js",
+    "serve:quickapp-native": "node node_modules/@dcloudio/uni-quickapp-native/bin/serve.js",
+    "test:android": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=android jest -i",
+    "test:h5": "cross-env UNI_PLATFORM=h5 jest -i",
+    "test:ios": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=ios jest -i",
+    "test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i",
+    "test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i"
+  },
+  "dependencies": {
+    "@dcloudio/uni-app": "2.0.2-4010520240507001",
+    "@dcloudio/uni-app-plus": "2.0.2-4010520240507001",
+    "@dcloudio/uni-h5": "2.0.2-4010520240507001",
+    "@dcloudio/uni-helper-json": "*",
+    "@dcloudio/uni-i18n": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-360": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-alipay": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-baidu": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-jd": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-kuaishou": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-lark": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-qq": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-toutiao": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-vue": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-weixin": "2.0.2-4010520240507001",
+    "@dcloudio/uni-mp-xhs": "2.0.2-4010520240507001",
+    "@dcloudio/uni-quickapp-native": "2.0.2-4010520240507001",
+    "@dcloudio/uni-quickapp-webview": "2.0.2-4010520240507001",
+    "@dcloudio/uni-stacktracey": "2.0.2-4010520240507001",
+    "@dcloudio/uni-stat": "2.0.2-4010520240507001",
+    "@icon-park/vue": "^1.4.1",
+    "@types/base-64": "^1.0.0",
+    "@types/js-base64": "^3.3.1",
+    "@types/lodash": "^4.14.172",
+    "@types/utf8": "^3.0.1",
+    "@vue/shared": "3.4.27",
+    "base-64": "^1.0.0",
+    "core-js": "^3.6.5",
+    "dayjs": "^1.11.9",
+    "flyio": "0.6.14",
+    "lodash": "^4.17.21",
+    "node-sass": "^4.14.1",
+    "qrcode": "^1.5.3",
+    "regenerator-runtime": "^0.12.1",
+    "sass-loader": "^7.3.1",
+    "uni-read-pages": "^1.0.5",
+    "uni-simple-router": "^2.0.7",
+    "uqrcodejs": "^4.0.7",
+    "utf8": "^3.0.0",
+    "vue": "^2.6.11",
+    "vue-class-component": "^6.3.2",
+    "vue-property-decorator": "^8.0.0",
+    "vuex": "3.6.2",
+    "vuex-class": "^0.3.2"
+  },
+  "devDependencies": {
+    "@babel/plugin-syntax-typescript": "^7.2.0",
+    "@babel/runtime": "~7.12.0",
+    "@dcloudio/types": "*",
+    "@dcloudio/uni-automator": "2.0.2-4010520240507001",
+    "@dcloudio/uni-cli-i18n": "2.0.2-4010520240507001",
+    "@dcloudio/uni-cli-shared": "2.0.2-4010520240507001",
+    "@dcloudio/uni-migration": "2.0.2-4010520240507001",
+    "@dcloudio/uni-template-compiler": "2.0.2-4010520240507001",
+    "@dcloudio/vue-cli-plugin-hbuilderx": "2.0.2-4010520240507001",
+    "@dcloudio/vue-cli-plugin-uni": "2.0.2-4010520240507001",
+    "@dcloudio/vue-cli-plugin-uni-optimize": "2.0.2-4010520240507001",
+    "@dcloudio/webpack-uni-mp-loader": "2.0.2-4010520240507001",
+    "@dcloudio/webpack-uni-pages-loader": "2.0.2-4010520240507001",
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-plugin-typescript": "*",
+    "@vue/cli-service": "~4.5.0",
+    "babel-plugin-import": "1.13.8",
+    "cross-env": "7.0.3",
+    "jest": "25.5.4",
+    "mini-types": "*",
+    "miniprogram-api-typings": "*",
+    "postcss-comment": "^2.0.0",
+    "typescript": "^3.0.0",
+    "vue-template-compiler": "^2.6.11"
+  },
+  "browserslist": [
+    "Android >= 4",
+    "ios >= 8"
+  ],
+  "uni-app": {
+    "scripts": {}
+  }
+}

+ 22 - 0
postcss.config.js

@@ -0,0 +1,22 @@
+const path = require('path')
+module.exports = {
+  parser: require('postcss-comment'),
+  plugins: [
+    require('postcss-import')({
+      resolve (id, basedir, importOptions) {
+        if (id.startsWith('~@/')) {
+          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(3))
+        } else if (id.startsWith('@/')) {
+          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(2))
+        } else if (id.startsWith('/') && !id.startsWith('//')) {
+          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(1))
+        }
+        return id
+      }
+    }),
+    require('autoprefixer')({
+      remove: process.env.UNI_PLATFORM !== 'h5'
+    }),
+    require('@dcloudio/vue-cli-plugin-uni/packages/postcss')
+  ]
+}

+ 29 - 0
public/index.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+    <head>
+        <meta charset="utf-8">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <title>
+            <%= htmlWebpackPlugin.options.title %>
+        </title>
+        <script>
+            document.addEventListener('DOMContentLoaded', function() {
+                document.documentElement.style.fontSize = document.documentElement.clientWidth / 20 + 'px'
+            })
+            var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
+            document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+        </script>
+		<!-- <script src="https://map.qq.com/api/js?v=2.exp&key=YIMBZ-BDLCB-R5QUZ-JUP7V-F7F6H-ESB33"></script> -->
+        <link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
+    </head>
+
+    <body>
+        <noscript>
+            <strong>Please enable JavaScript to continue.</strong>
+        </noscript>
+        <div id="app"></div>
+        <!-- built files will be auto injected -->
+    </body>
+
+</html>

+ 339 - 0
src/App.vue

@@ -0,0 +1,339 @@
+<script>
+	import Vue from 'vue';
+	import {
+		mapGetters
+	} from 'vuex';
+	// #ifdef APP
+	// const jpushModule = uni.requireNativePlugin('JG-JPush');
+	// @ts-ignore
+	// import {
+	// 	MessagePush
+	// } from '@/common/aliyun.js';
+	// #endif
+	export default {
+		mpType: 'app',
+		globalData: {
+			NavHeight: 0,
+			windowHeight: 0,
+			isIPX: false,
+			statusBarHeight: 0
+		},
+		computed: {
+			...mapGetters({
+				_token: 'base/_token'
+			}),
+		},
+		onLaunch: function() {
+			// console.log('App Launch');
+			this.$nextTick(function() {
+				uni.hideTabBar();
+			});
+			uni.getSystemInfo({
+				success: res => {
+					console.log(res);
+					this.globalData.statusBarHeight = res.statusBarHeight;
+					this.globalData.NavHeight = res.statusBarHeight + 42;
+					this.globalData.windowHeight = res.windowHeight;
+					if (res.statusBarHeight > 20 && res.platform.toUpperCase() === 'IOS') {
+						console.log('Device is iPhoneX!!!');
+						// 底部安全距离为 68rpx  34px
+						this.globalData.isIPX = true;
+					}
+				}
+			});
+
+
+
+			// #ifdef APP-PLUS
+			this.MessagePush();
+			// jpushModule.initJPushService();
+			// jpushModule.setLoggerEnable(true);
+			// // // 设置别名
+			// // jpushModule.setAlias({
+			// // 	alias: '',
+			// // 	sequence: 1
+			// // });
+			// this.getNotificationEnabled();
+			// //监听 极光推送连接状态
+			// jpushModule.addConnectEventListener((result) => {
+			// 	console.log('监听 极光推送连接状态', result);
+			// 	let connectEnable = result.connectEnable;
+			// 	uni.$emit('connectStatusChange', connectEnable);
+			// });
+			// //极光推送的消息通知回调
+			// jpushModule.addNotificationListener((result) => {
+			// 	jpushModule.setBadge(0);
+			// 	plus.runtime.setBadgeNumber(0);
+			// 	let notificationEventType = result.notificationEventType;
+			// 	// let woopId = result.extras && result.extras.dataType === 'woop' && result.extras.value;
+			// 	console.log('通知', result, notificationEventType);
+			// 	// 点击事件
+			// 	if (notificationEventType == 'notificationOpened') {
+			// 		uni.navigateTo({
+			// 			url: '/pages/mine-merchant/order-management/order-management'
+			// 		});
+			// 	}
+			// });
+			// uni.$on('connectStatusChange', (connectStatus) => {
+			// 	var connectStr = '';
+			// 	if (connectStatus == true) {
+			// 		connectStr = '已连接';
+			// 		this.getRegistrationID();
+			// 	} else {
+			// 		connectStr = '未连接';
+			// 	}
+			// 	console.log('监听到了连接状态变化 --- ', connectStr);
+			// });
+			//#endif
+
+
+		},
+		onShow: function() {
+			// console.log('App Show');
+		},
+		onHide: function() {
+			console.log('App Hide');
+		},
+
+		methods: {
+			// getRegistrationID() {
+			// 	jpushModule.getRegistrationID((result) => {
+			// 		let registerID = result.registerID;
+			// 		console.log('获取registerID', registerID);
+			// 		this.setSto('registerID', registerID);
+			// 	});
+			// },
+			// getNotificationEnabled() {
+			// 	if (uni.getSystemInfoSync().platform == 'ios') {
+			// 		jpushModule.requestNotificationAuthorization((result) => {
+			// 			let status = result.status;
+			// 			if (status < 2) {
+			// 				this.noticMsgTool();
+			// 			}
+			// 		});
+			// 	} else {
+			// 		jpushModule.isNotificationEnabled((result) => {
+			// 			console.log('判断android是否打开权限1:true,0:false', result);
+			// 			if (result.code == 0) {
+			// 				//如果为0则表示 未打开通知权限
+			// 				this.noticMsgTool();
+			// 			}
+			// 		});
+			// 	}
+			// },
+			MessagePush() {
+				// 判断客户端环境是ios、android、小程序
+				const platform = uni.getSystemInfoSync().platform;
+				if (!['ios', 'android'].includes(platform)) return;
+				const aliyunPush = uni.requireNativePlugin('Aliyun-Push');
+				// console.log(aliyunPush , 'aliyunPush ')
+				const that = this;
+				// ios
+				if (platform == 'ios') {
+					// 获取设备ID的方法
+					const idResult = aliyunPush.getDeviceId();
+					console.log(idResult, '存设备ID')
+					if (idResult.data.deviceId != '') {
+						// 存设备ID
+						uni.setStorageSync('registerID', idResult.data.deviceId);
+					}
+					//一个设备只能绑定一个账号,一个账号被设备绑定也有次数限制 account是要绑定的账号参数
+					// aliyunPush.bindAccount({ 
+					// 	account: this.account
+					// }, result1 => {
+					// 	console.error("苹果bindAccount注册推送", result1)
+					// });
+
+					// 应用在前台时,推送通知 应用在前台时,是否展示推送通知,默认false不展示
+					aliyunPush.showNoticeWhenForeground({
+						enable: true
+					});
+					// 注册前台推送通知的回调接口
+					aliyunPush.setNotificationCallback({}, res => {
+						console.error("setNotificationCallback", JSON.stringify(res))
+					})
+					// 注册推送消息的回调接口
+					aliyunPush.setMessageCallback({}, result => {
+						console.error("setMessageCallback", JSON.stringify(result))
+					});
+					// 注册用户点击推送通知的回调接口
+					aliyunPush.setNotificationResponseCallback({}, result => {
+						console.error("setNotificationResponseCallback", result)
+					});
+				}
+				// 安卓
+				if (platform == 'android') {
+					// 注册推送,开始接收数据
+					aliyunPush.registerPush({}, result => {
+						const event = result.event;
+						const channel = uni.requireNativePlugin('Aliyun-Push-NotificationChannel');
+						// 检查 应用通知通道的总开关
+						const channelRes = channel.isNotificationEnabled({
+							id: 'amp_channel'
+						});
+						// 先创建NotificationChannel
+						channel.createChannel({
+							id: 'amp_channel',
+							name: '安卓通知通道',
+							desc: '安卓通知通道',
+							importance: 3,
+						});
+						// 厂商通道
+						const aliyunThirdPush = uni.requireNativePlugin('Aliyun-ThirdPush');
+						// 在用户点击厂商通道推送的通知后,应用通过此接口接收数据 用户未点击或者直接移除,应用是无法感知的。
+						aliyunThirdPush.registerThirdPush({}, thirdRes => {
+							const data = JSON.stringify(thirdRes);
+							androidOperations(data, 1)
+						})
+						// 注册日志接口
+						aliyunThirdPush.registerLog({}, result => {
+							console.log("third push plugin log : " + result);
+						})
+						// 注册推送
+						if (event === 'registerPush') {
+							if (result.code === 'success') {
+								console.log("注册推送 成功 ");
+								// 获取设备推送ID,注意必须注册推送成功之后,才能获取
+								const idResult = aliyunPush.getDeviceId();
+								if (idResult.data.deviceId != '') {
+									// 存设备ID
+									uni.setStorageSync('registerID', idResult.data.deviceId);
+								}
+								console.log(idResult.data.deviceId);
+								idResult.data.deviceId && this.setUserRid(idResult.data.deviceId);
+								// aliyunPush.bindAccount({ //一个设备只能绑定一个账号,一个账号被设备绑定也有次数限制
+								// 	account: this.account // 登陆成功获取到的
+								// }, result1 => {
+								// 	console.error("安卓bindAccount注册推送", result1)
+								// });
+							} else {
+								console.log("注册推送 " + result.code + " " + result.msg);
+							}
+						}
+						// 打开通知
+						else if (event === 'onNotificationOpened') {
+							// 跳转,具体业务
+							const res = JSON.stringify(result);
+							androidOperations(res, 2)
+						} else {
+							console.log("receive push event : " + event);
+							console.log("receive push data : " + JSON.stringify(result));
+							// uniapp的消息提示 本项目中需要后端配置 此处代码不要
+							uni.createPushMessage({
+								title: result.data.title,
+								content: result.data.content
+							})
+						}
+					});
+				}
+			},
+			androidOperations(data, index) {
+				let arr;
+				if (index == 1) {
+					arr = JSON.parse(data);
+				} else if (index == 2) {
+					arr = JSON.parse(JSON.parse(data).data.extraStr);
+				}
+			},
+			noticMsgTool() {
+				if (uni.getSystemInfoSync().platform == 'ios') {
+					//苹果打开对应的通知栏
+					uni.showModal({
+						title: '通知权限开启提醒',
+						content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
+						showCancel: false,
+						confirmText: '去设置',
+						success: function(res) {
+							if (res.confirm) {
+								var app = plus.ios.invoke('UIApplication', 'sharedApplication');
+								var setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
+								plus.ios.invoke(app, 'openURL:', setting);
+								plus.ios.deleteObject(setting);
+								plus.ios.deleteObject(app);
+							}
+						}
+					});
+				} else {
+					//android打开对应的通知栏
+					var main = plus.android.runtimeMainActivity();
+					var pkName = main.getPackageName();
+					var uid = main.getApplicationInfo().plusGetAttribute('uid');
+					uni.showModal({
+						title: '通知权限开启提醒',
+						content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
+						showCancel: false,
+						confirmText: '去设置',
+						success: function(res) {
+							if (res.confirm) {
+								var Intent = plus.android.importClass('android.content.Intent');
+								var Build = plus.android.importClass('android.os.Build');
+								//android 8.0引导
+								if (Build.VERSION.SDK_INT >= 26) {
+									var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
+									intent.putExtra('android.provider.extra.APP_PACKAGE', pkName);
+								} else if (Build.VERSION.SDK_INT >= 21) {
+									//android 5.0-7.0
+									var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
+									intent.putExtra('app_package', pkName);
+									intent.putExtra('app_uid', uid);
+								} else {
+									//(<21)其他--跳转到该应用管理的详情页
+									intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+									var uri = Uri.fromParts('package', mainActivity.getPackageName(), null);
+									intent.setData(uri);
+								}
+								// 跳转到该应用的系统通知设置页
+								main.startActivity(intent);
+							}
+						}
+					});
+				}
+			},
+			setUserRid(appRid) {
+				// uni.showLoading({
+				// 	title: '加载中',
+				// });
+				if(!this._token) return;
+				this.$http.post({
+					url: this.$api.setUserRid,
+					data: {
+						appRid: appRid
+					}
+				}).then((res) => {
+					// uni.hideLoading();
+				})
+			}
+		},
+	};
+</script>
+
+<style lang="scss">
+	/* 在线链接服务仅供平台体验和调试使用,平台不承诺服务的稳定性,企业客户需下载字体包自行发布使用并做好备份。 */
+	// @font-face {
+	// 	font-family: 'iconfont';
+	// 	/* Project id 3695491 */
+	// 	src: url('//at.alicdn.com/t/c/font_3695491_hk38bgiibu.woff2?t=1683873775480') format('woff2'),
+	// 		url('//at.alicdn.com/t/c/font_3695491_hk38bgiibu.woff?t=1683873775480') format('woff'),
+	// 		url('//at.alicdn.com/t/c/font_3695491_hk38bgiibu.ttf?t=1683873775480') format('truetype');
+	// }
+
+	// /* 在线链接服务仅供平台体验和调试使用,平台不承诺服务的稳定性,企业客户需下载字体包自行发布使用并做好备份。 */
+	// @font-face {
+	//   font-family: 'iconfont';  /* Project id 4183037 */
+	//   src: url('//at.alicdn.com/t/c/font_4183037_gcs8bip06v.woff2?t=1692781427828') format('woff2'),
+	//        url('//at.alicdn.com/t/c/font_4183037_gcs8bip06v.woff?t=1692781427828') format('woff'),
+	//        url('//at.alicdn.com/t/c/font_4183037_gcs8bip06v.ttf?t=1692781427828') format('truetype');
+	// }
+	
+	/* 在线链接服务仅供平台体验和调试使用,平台不承诺服务的稳定性,企业客户需下载字体包自行发布使用并做好备份。 */
+	@font-face {
+	  font-family: 'iconfont';  /* Project id 4475043 */
+	  src: url('https://at.alicdn.com/t/c/font_4475043_4jx67uhseqb.woff2?t=1718615657530') format('woff2'),
+	       url('https://at.alicdn.com/t/c/font_4475043_4jx67uhseqb.woff?t=1718615657530') format('woff'),
+	       url('https://at.alicdn.com/t/c/font_4475043_4jx67uhseqb.ttf?t=1718615657530') format('truetype');
+	}
+
+	page {
+		background-color: #FAFAFA;
+	}
+</style>

+ 120 - 0
src/common/aliyun.js

@@ -0,0 +1,120 @@
+/* 消息推送 */
+function MessagePush(){
+	// 判断客户端环境是ios、android、小程序
+	const platform = uni.getSystemInfoSync().platform;
+	if (!['ios', 'android'].includes(platform)) return;
+	const aliyunPush = uni.requireNativePlugin('Aliyun-Push');
+	// console.log(aliyunPush , 'aliyunPush ')
+	const that = this;
+	// ios
+	if (platform == 'ios') {
+		// 获取设备ID的方法
+		const idResult = aliyunPush.getDeviceId();
+		console.log(idResult,'存设备ID')
+		if (idResult.data.deviceId != '') {
+			// 存设备ID
+			uni.setStorageSync('registerID', idResult.data.deviceId);
+		}
+		//一个设备只能绑定一个账号,一个账号被设备绑定也有次数限制 account是要绑定的账号参数
+		// aliyunPush.bindAccount({ 
+		// 	account: this.account
+		// }, result1 => {
+		// 	console.error("苹果bindAccount注册推送", result1)
+		// });
+			
+		// 应用在前台时,推送通知 应用在前台时,是否展示推送通知,默认false不展示
+		aliyunPush.showNoticeWhenForeground({
+			enable: true
+		});
+		// 注册前台推送通知的回调接口
+		aliyunPush.setNotificationCallback({},res=>{
+			console.error("setNotificationCallback", JSON.stringify(res))
+		})
+		// 注册推送消息的回调接口
+		aliyunPush.setMessageCallback({}, result => {
+			console.error("setMessageCallback", JSON.stringify(result))
+		});
+		// 注册用户点击推送通知的回调接口
+		aliyunPush.setNotificationResponseCallback({}, result => {
+			console.error("setNotificationResponseCallback", result)
+		});
+	}
+	// 安卓
+	if (platform == 'android') {
+		// 注册推送,开始接收数据
+		aliyunPush.registerPush({}, result => {
+			const event = result.event;
+			const channel = uni.requireNativePlugin('Aliyun-Push-NotificationChannel');
+			// 检查 应用通知通道的总开关
+			const channelRes = channel.isNotificationEnabled({
+				id: 'amp_channel'
+			});
+			// 先创建NotificationChannel
+			channel.createChannel({
+				id: 'amp_channel',
+				name: '安卓通知通道',
+				desc: '安卓通知通道',
+				importance: 3,
+			});
+			// 厂商通道
+			const aliyunThirdPush = uni.requireNativePlugin('Aliyun-ThirdPush');
+			// 在用户点击厂商通道推送的通知后,应用通过此接口接收数据 用户未点击或者直接移除,应用是无法感知的。
+			aliyunThirdPush.registerThirdPush({}, thirdRes => {
+				const data = JSON.stringify(thirdRes);
+				androidOperations(data,1)
+			})
+			// 注册日志接口
+			aliyunThirdPush.registerLog({}, result => {
+				console.log("third push plugin log : " + result);
+			})
+			// 注册推送
+			if (event === 'registerPush') {
+				if (result.code === 'success') {
+					console.log("注册推送 成功 ");
+					// 获取设备推送ID,注意必须注册推送成功之后,才能获取
+					const idResult = aliyunPush.getDeviceId();
+					if (idResult.data.deviceId != '') {
+						// 存设备ID
+						uni.setStorageSync('registerID', idResult.data.deviceId);
+					}
+					console.log(idResult.data.deviceId);
+					// aliyunPush.bindAccount({ //一个设备只能绑定一个账号,一个账号被设备绑定也有次数限制
+					// 	account: this.account // 登陆成功获取到的
+					// }, result1 => {
+					// 	console.error("安卓bindAccount注册推送", result1)
+					// });
+				} else {
+					console.log("注册推送 " + result.code + " " + result.msg);
+				}
+			}
+			// 打开通知
+			else if (event === 'onNotificationOpened') {
+				// 跳转,具体业务
+				const res = JSON.stringify(result);
+				androidOperations(res,2)
+			} else {
+				console.log("receive push event : " + event);
+				console.log("receive push data : " + JSON.stringify(result));
+				// uniapp的消息提示 本项目中需要后端配置 此处代码不要
+				// uni.createPushMessage({
+				// 	title:result.data.title,
+				// 	content:result.data.content
+				// })
+			}
+		});
+	}
+}
+
+// 推送成功后具体业务
+function androidOperations(data,index) {
+	let arr;
+	if(index == 1){
+		arr = JSON.parse(data);
+	}else if(index == 2){
+		arr = JSON.parse(JSON.parse(data).data.extraStr);
+	}
+}
+
+export {
+    MessagePush
+}

+ 272 - 0
src/common/api.ts

@@ -0,0 +1,272 @@
+// import { $http } from '@/common/http';
+
+
+export default {
+	login: '/user/auth/login',						//登录
+	register: '/user/auth/register',				//注册
+	logout: '/admin/signout',						//退出
+	Qrcode: '/common/wx/mini/code',					//生成二维码
+	sendCode: '/common/send/sms/code',				//发送验证码
+	verifyCode: '/common/verify/sms/code', 					//验证短信验证码
+	
+	getPlatformStatus: '/user/auth/get/platform/open/status',
+	
+	tokenLogin: '/user/user/token/login',
+	
+	getShareCode: '/common/create/share/qr', //获取分享二维码
+	
+	getUserInfoById: '/user/user/base/info',
+	
+	getVersion: '/user/setup/check/version', //获取app当前版本号
+
+	setPayPwd: '/user/user/pay/password/set', //设置支付密码
+	setPwd: '/user/user/login/password/set', //设置登录密码
+	
+	setUserInfo: '/user/user/member/set', //设置会员姓名、日期、所在地 
+
+	bindReferrer: '/user/user/bind/referrer', 		//绑定临时上级
+	getShareInfo: '/user/setup/share/info', 		//C端分享设置详情
+	updateUserInfo: '/user/user/update/info',//更新个人信息
+	isPayPassword: '/user/user/pay/password/check',
+	
+	getMpQr: '/common/create/mp/qr',
+
+	// 商品相关=====================
+	getBannerList: '/user/setup/banner/get',		//轮播图
+	// getCategoryList: '/user/goods/groupings/list', 	// 分类列表
+	getGoodsList: '/user/goods/list', 				// 商品列表
+	getGoodsInfo: '/user/goods/info', 				// 商品详情
+	getCategoryList: '/user/goods/sort/list', 			//分类列表
+	getPartitionCategoryList: '/user/goods/sort/partition/list', 			//分类列表
+	
+	getGoodsStocks: '/user/goods/query/stocks',
+
+	// 购物车
+	carGoodsList: '/user/cart/list', 				// 购物车列表
+	addCarGoods: '/user/cart/update', 				// 加入购物车
+	batchUpdateCarGoods: '/user/cart/batch/update', //批量更新购物车
+
+	// 地址相关=====================
+	addressList: '/user/address/list', 				// 地址列表
+	addressDetail: '/user/address/info', 			// 地址详情
+	addressAdd: '/user/address/add', 				// 地址添加
+	addressEdit: '/user/address/update', 			// 地址编辑
+	deleteAddress: '/user/address/del', 			// 地址删除
+	addressDefault: '/user/address/set/default', 	// 地址设置默认
+	getArea: '/common/allarea',						//地区编码, //获取省市区地址
+
+
+	// 订单相关=====================
+	orderList: '/user/order/list', 					// 订单列表
+	orderDetail: '/user/order/info', 				// 订单详情
+	logistics: '/user/order/query/logistic', 		// 物流信息
+	cancelOrder: '/user/order/cancel', 				// 取消订单
+	confirmOrder: '/user/order/confirm', 			// 确认收货
+	submitOrder: '/user/order/query/payment', 		//计算订单应付金额
+	createOrder: '/user/order/create', 				// 创建订单
+	getPayParmas: '/user/pay/create',				// 拉取支付参数
+	closePay: '/user/pay/close', 					//关闭支付
+	getOrderNum: '/user/order/count/num', 			//查询各状态订单数量
+	getPayParmasStatus: '/user/pay/query/pay/bill',
+	getOrderWaitPay: '/user/order/query/wait/pay/timeout',
+	
+	getLogisticsInfo: '/user/order/query/logistic', //获取物流信息
+
+	// 用户
+	// getBalance: '/user/fund/balance/get',
+	isRealName: '/user/user/authentication/check', //检查是否实名认证
+	getUserInfo: '/user/user/info',//查询个人信息
+
+	// 提现
+	addWithdrawInfo: '/user/draw/data/add',
+	getWithdrawList: '/user/draw/data/list',
+	getWithdrawInfo: '/user/draw/data/info',
+	applyWithdraw: '/user/draw/log/add',
+	getDrawInfo: '/user/draw/info',
+	
+	
+	getKpiDrawInfo: '/user/draw/kpi/info',
+	setKpiWithdrawInfo: '/user/draw/kpi/data/add',
+	getKpiWithdrawInfo: '/user/draw/kpi/data/info',
+	applyKpiWithdraw: '/user/draw/kpi/log/add',
+	
+	transferApply: '/user/fund/transfer/execute',
+
+
+	// 售后
+	applyAfterSale: '/user/order/after/sales/create',
+	cancelAfterSale: '/user/order/after/sales/cancel',
+	getAfterSalePayment: '/user/order/after/sale/calculate',
+	// cancel: '/user/order/after/sales/cancel',
+
+
+	getAfterSaleList: '/user/order/after/sale/list',
+	getAfterSaleDetail: '/user/order/after/sale/info',
+	// cancelAfterSale: '/user/order/after/sale/repeal/apply',
+	getCompanyList: '/user/order/after/sale/return/company/list',
+	setCompanyInfo: '/user/order/after/sale/update/return/proof',
+	
+	
+	realName: '/user/user/authentication',
+	
+	getNoticeList: '/user/message/list',
+	
+	getMessageList: '/user/interior/message/list',
+	getMessageNum: '/user/interior/message/number',
+	readMessage: '/user/interior/message/mark/read',
+	readAllMessage: '/user/interior/message/all/mark/read',
+	
+	getFansList: '/user/user/fans/list',
+	
+	// getQuotaInfo: '/user/quota/info',
+	
+	getFundLogs: '/user/fund/logs',
+	getFundTypeList: '/user/fund/type/list',
+	
+	
+	getRebateSum: '/user/rebate/query/sum/data',
+	bindOpenId: '/user/user/bind/wx',
+	widthdrawLogs: '/user/draw/log/list',
+	
+	widthdrawKpiLogs: '/user/draw/kpi/log/list',
+	
+	
+	
+	
+	
+	getPublicCodeInfo: '/user/public/code/info',
+	
+	
+	applyAgent: '/user/user/agent/apply',
+	getAgentInfo: '/user/user/agent/info',
+	
+	
+	
+	// getShopManageInfo: '/user/shop/manage/info',
+	updateShopManage: '/user/shop/manage/update',
+	// addShopManage: '/user/shop/manage/add',
+	
+	
+	
+	
+	getClassroomPosterInfo: '/user/classroom/poster/info',
+	getClassroomSortList: '/user/classroom/sort/list',
+	getClassroomInfo: '/user/classroom/article/info',
+	getClassroomArticleList: '/user/classroom/article/list',
+	
+	
+	getDictionaryList: '/user/dictionary/item/list/son',
+	
+	
+	getApplyVip: '/user/user/apply/vip/top',
+	
+	openQuota: '/user/quota/open',
+	
+	getQuotaInfo: '/user/quota/info',
+	
+	
+	getRebateInfoList: '/user/rebate/info/list',
+	getRebateTypeList: '/user/rebate/info/type/list',
+	
+	
+	
+	getBalance: '/user/fund/info/personal/center/balance',
+	
+	getWalletInfo: '/user/fund/info/wallet/data',
+	
+	
+	getFundInfoSum: '/user/fund/info/sum',
+	getFundInfoList: '/user/fund/info/list',
+	
+	getKpiList: '/user/kpi/list',
+	getKpiStatistics: '/user/kpi/statistics',
+	
+	
+	getAgreementInfo: '/user/agreement/info',
+	
+	getDynamicsList: '/user/setup/news/list',
+	getDynamicsInfo: '/user/setup/news/info',
+	
+	
+	bindUnionId: '/user/auth/bind/union',
+	
+	//实名认证
+	checkShopManage: '/user/shop/manage/check',
+	getShopManageInfo: '/user/shop/manage/info',
+	submitShopManage: '/user/shop/manage/submit',
+	addShopManage: '/user/shop/manage/add',
+	deleteShopManage: '/user/shop/manage/delete',
+	
+	
+	getShopTypeManageList: '/user/shop/type/manage/list',
+	getShopTypeManageInfo: '/user/shop/type/manage/info',
+	
+	getArticleList: '/user/article/list',
+	
+	
+	getProblemList: '/user/problem/list',
+	
+	addFeedback: '/user/feedback/add',
+	
+	
+	buyRoleUpgrade:'/user/buy/role/upgrade',
+	
+	createBuyRole: '/user/buy/role/create',
+	
+	// 购买代理
+	buyRoleFirstInfo: '/user/buy/role/first/info',
+	buyRoleSecondInfo: '/user/buy/role/second/info',
+	getBuyRoleAreaAmount: '/user/buy/role/get/area/amount',
+	
+	getBuyRoleCostStatus: '/user/buy/role/status',
+	
+	getRoleNowStatus: '/user/buy/role/now/status',
+	
+	checkBuyRoleCost: '/user/buy/role/cost/check',
+	
+	openBuyRole: '/user/buy/role/open',
+	
+	
+	buyRoleCost: '/user/buy/role/cost',
+	payBuyRoleCost: '/user/buy/role/cost/pay',
+	
+	setUserRid: '/user/user/set/rid',
+	
+	
+	addService: '/user/service/add',
+	
+	getPickupList: '/user/goods/shop/order/pickup/list',
+	
+	
+	getShopStockList: '/user/goods/shop/stock/list',
+	
+	
+	getOrderReplenishmentList: '/user/order/replenishment/list',
+	
+	getStockReduceLogs: '/user/goods/shop/stock/reduce/logs',
+	
+	reduceStock: '/user/goods/shop/stock/reduce',
+	
+	getShopOrderList: '/user/order/shop/list',
+	getShopOrderInfo: '/user/order/shop/info',
+	redeemShopOrder: '/user/order/shop/redeem',
+	
+	getVipProgress: '/user/user/vip/progress',
+	
+	confirmReplenishmentOrder: '/user/order/replenishment/confirm',
+	
+	
+	getOrderEvaluationListById: '/user/order/evaluation/list',
+	createOrderEvaluation: '/user/order/evaluation/create',
+	
+	getBalanceList: '/user/fund/info/balance/list',
+	getVoucherList: '/user/fund/info/voucher/list',
+	getFundTypeMap: '/user/fund/info/type/map',
+	
+	getWillReleaseAmount: '/user/rebate/info/will/release/amount',
+	
+	fundTransferExecute: '/user/fund/transfer/execute',
+	
+	
+	
+}

+ 36 - 0
src/common/constants.ts

@@ -0,0 +1,36 @@
+const EDITOR_CONTAINER_PADDING = 20;
+const LOGIN_URL = '/pages/login/login';
+const PHONE_LOGIN_URL = '/pages/login/login';
+const OSS_STATIC = 'https://qyjj-img.datouit.com/static/';
+const MAP_KEY = '5K7BZ-OSO6O-UZKW5-SDZHI-FEZ3T-IMBV4'; //腾讯地图key
+const ANDROID_KEY = 'e2d09a80a04949a797afa3878af75e25';// 高德地图的android的key
+const WX_KEY = 'd8e87fb5aaadb382dc03a4166b2fb5ad';// 高德地图的微信小程序key
+const AREA_OSS = 'https://dt-test-dev.oss-cn-beijing.aliyuncs.com/area/allArea30.json';
+const PHONENNUMBER = '';
+const APP_BASE_URL= 'https://qyjj-img.datouit.com/app/';
+const EMAIL = '';
+const APP_ID_GH = 'gh_5f5c2e07aef3';
+const WX_PAY_TYPE = 2;
+
+function RegPhone(str: string) {
+	let regu = /^[1][0-9]{10}$/;
+	let re = new RegExp(regu);
+	return re.test(str);
+}
+
+export {
+	EDITOR_CONTAINER_PADDING,
+	LOGIN_URL,
+	OSS_STATIC,
+	MAP_KEY,
+	RegPhone,
+	PHONE_LOGIN_URL,
+	WX_KEY,
+	ANDROID_KEY,
+	AREA_OSS,
+	PHONENNUMBER,
+	APP_BASE_URL,
+	EMAIL,
+	APP_ID_GH,
+	WX_PAY_TYPE
+};

+ 38 - 0
src/common/error.ts

@@ -0,0 +1,38 @@
+import { router } from '@/router';
+import { LOGIN_URL, PHONE_LOGIN_URL } from '@/common/constants';
+import Store, { types } from '@/common/store/index.ts';
+
+const error_handle = function(err: any): void {
+	console.log(err, 123);
+	let retcode = parseInt(err.code);
+	if (retcode === 1001) {
+		toLogin();
+		Store.commit(`base/${types.LOGOUT}`);
+	}
+	// uni.showModal({
+	// 	content: err.msg,
+	// 	confirmText: '知道了',
+	// });
+	setTimeout(() => {
+		uni.showToast({ title: err.msg || '网络异常', duration: 2000, icon: 'none' });
+	}, 100);
+};
+
+const toLogin = function(){
+	// #ifdef MP-WEIXIN
+		router.push({
+			path: LOGIN_URL
+		});
+	// #endif
+	// #ifndef MP-WEIXIN
+	router.push({
+		path: PHONE_LOGIN_URL
+	});
+	// #endif
+	// Store.commit(`base/${types.LOGOUT}`);
+	// router.pushTab({
+	// 	path: '/pages/front/front'
+	// });
+}
+
+export default error_handle;

+ 22 - 0
src/common/http/config.ts

@@ -0,0 +1,22 @@
+let baseUrl = '';
+
+const VUE_APP_REMOTE_HOST = process.env.VUE_APP_REMOTE_HOST;
+
+// #ifndef H5
+// #endif
+
+baseUrl = `https://${VUE_APP_REMOTE_HOST}`;
+
+// #ifdef H5
+if(location.host === 'qyjj-h5-dev.datounet.com'){
+	baseUrl = `https://qyjj-api-dev-go.datounet.com`;
+}
+// #endif
+
+
+const config = {
+  baseUrl,
+  dataType: 'text',
+};
+
+export default config;

+ 159 - 0
src/common/http/http.ts

@@ -0,0 +1,159 @@
+import map from 'lodash/map';
+import set from 'lodash/set';
+import get from 'lodash/get';
+import isFunction from 'lodash/isFunction';
+import error_handle from '@/common/error';
+
+// const reset_config = function reset_config(settting:any):any ;
+
+class Http {
+	config = {
+		baseUrl: '',
+		header: {},
+	}
+
+	interceptor = {
+		request(config:any):any {
+			const req_config = config;
+			set(req_config, 'header.X-Requested-With', 'XMLHttpRequest');
+			// set(req_config, 'header.mobileapp', 'true');
+			const token = uni.getStorageSync('token');
+			set(req_config, 'header.Authorization', token);
+			return req_config;
+		},
+		// response(res) {},
+	}
+
+	set_config(config:any):void {
+		Object.keys(config).forEach((key:string):void => {
+			(this as any).config[key] = config[key];
+		});
+	}
+
+	post(settting:any):any {
+		return this.ajax({
+			...settting,
+			method: 'POST'
+		});
+	}
+
+	get(settting:any):any {
+		return this.ajax({
+			...settting,
+			method: 'GET'
+		});
+	}
+	
+	put(settting:any):any {
+		return this.ajax({
+			...settting,
+			method: 'PUT'
+		});
+	}
+	
+	delete(settting:any):any {
+		return this.ajax({
+			...settting,
+			method: 'DELETE'
+		});
+	}
+
+	async upPic(setting:any):Promise<any> {
+		// console.log(444444)
+		let settingCopy = {
+			type: 2,
+			url: '/common/upload',
+			...setting
+		};
+		if (!settingCopy.filePath) {
+			return
+		}
+		const data = {
+			prefix: "other"
+		}
+		return this.get({
+			url: settingCopy.url,
+			data,
+			headers: {
+				'content-type': 'application/x-www-form-urlencoded'
+			},
+		}).then((result:any) => {
+			// console.log(111111111)
+			return new Promise((resolve, reject) => {
+				uni.uploadFile({
+					url: result.host,
+					filePath: settingCopy.filePath,
+					name: 'file',
+					formData: {
+						name: settingCopy.filePath,
+						key: result.dir,
+						OSSAccessKeyId: result.accessid,
+						policy: result.policy,
+						signature: result.signature,
+						expire: result.expire,
+						callback: result.callback,
+						dir: 'admin/'
+					},
+					success(res) {
+						const _result = JSON.parse(res.data)
+						// console.log(2222222)
+						resolve(result.host + '/' + _result.url)
+					},
+					fail(res) {
+						// console.log(333333333)
+						uni.showToast({ title: "网络异常", duration: 2000, icon: 'none' });
+						reject(res)
+					}
+				})
+			})
+		})
+	}
+
+	ajax(settting:any):any {
+		return new Promise((resolve, reject) => {
+			const conf = this.reset_config(settting);
+			uni.request({
+				...conf,
+				success: (res: any) => {
+					const data = JSON.parse(res.data as string);
+					if (data.code === 200) {
+						resolve(data.data);
+					} else {
+						error_handle(data);
+						reject(data);
+					}
+				},
+				fail: (err: any) => {
+					error_handle(err);
+					reject(err);
+				},
+			});
+		});
+	}
+	
+	reset_config(settting:any):any {
+		let {
+			baseUrl,
+			...other_configs
+		} = this.config;
+		const {
+			url,
+			...other_settings
+		} = settting;
+		if(settting.hasOwnProperty("baseUrl")){
+			baseUrl = settting.baseUrl;
+		}
+		const new_url = baseUrl + url;
+		let config = {
+			url: new_url,
+			...other_configs,
+			...other_settings,
+		};
+		if (isFunction(this.interceptor.request)) {
+			config = this.interceptor.request(config);
+		}
+		return config;
+	}
+}
+
+export default Http;

+ 17 - 0
src/common/http/index.ts

@@ -0,0 +1,17 @@
+import Http from './http';
+import config from './config';
+import api from '../api';
+const $http = new Http();
+$http.set_config(config);
+
+const install = (Vue:any) => {
+  const VueCopy = Vue;
+  VueCopy.prototype.$api = {...api};
+  VueCopy.prototype.$http = $http;
+};
+
+export default { install };
+
+export {
+  $http,
+}

+ 5379 - 0
src/common/jsencrypt.js

@@ -0,0 +1,5379 @@
+(function(global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+		typeof define === 'function' && define.amd ? define(['exports'], factory) :
+		(factory((global.JSEncrypt = {})));
+}(this, (function(exports) {
+	'use strict';
+	var navigator2 = {
+		appName: 'Netscape',
+		userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
+	};
+	//  用来替换window2
+	var window2 = {
+		ASN1: null,
+		Base64: null,
+		Hex: null,
+		crypto: null,
+		href: null
+	};
+	var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+	function int2char(n) {
+		return BI_RM.charAt(n);
+	}
+	//#region BIT_OPERATIONS
+	// (public) this & a
+	function op_and(x, y) {
+		return x & y;
+	}
+	// (public) this | a
+	function op_or(x, y) {
+		return x | y;
+	}
+	// (public) this ^ a
+	function op_xor(x, y) {
+		return x ^ y;
+	}
+	// (public) this & ~a
+	function op_andnot(x, y) {
+		return x & ~y;
+	}
+	// return index of lowest 1-bit in x, x < 2^31
+	function lbit(x) {
+		if (x == 0) {
+			return -1;
+		}
+		var r = 0;
+		if ((x & 0xffff) == 0) {
+			x >>= 16;
+			r += 16;
+		}
+		if ((x & 0xff) == 0) {
+			x >>= 8;
+			r += 8;
+		}
+		if ((x & 0xf) == 0) {
+			x >>= 4;
+			r += 4;
+		}
+		if ((x & 3) == 0) {
+			x >>= 2;
+			r += 2;
+		}
+		if ((x & 1) == 0) {
+			++r;
+		}
+		return r;
+	}
+	// return number of 1 bits in x
+	function cbit(x) {
+		var r = 0;
+		while (x != 0) {
+			x &= x - 1;
+			++r;
+		}
+		return r;
+	}
+	//#endregion BIT_OPERATIONS
+
+	var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+	var b64pad = "=";
+
+	function hex2b64(h) {
+		var i;
+		var c;
+		var ret = "";
+		for (i = 0; i + 3 <= h.length; i += 3) {
+			c = parseInt(h.substring(i, i + 3), 16);
+			ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
+		}
+		if (i + 1 == h.length) {
+			c = parseInt(h.substring(i, i + 1), 16);
+			ret += b64map.charAt(c << 2);
+		} else if (i + 2 == h.length) {
+			c = parseInt(h.substring(i, i + 2), 16);
+			ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
+		}
+		while ((ret.length & 3) > 0) {
+			ret += b64pad;
+		}
+		return ret;
+	}
+	// convert a base64 string to hex
+	function b64tohex(s) {
+		var ret = "";
+		var i;
+		var k = 0; // b64 state, 0-3
+		var slop = 0;
+		for (i = 0; i < s.length; ++i) {
+			if (s.charAt(i) == b64pad) {
+				break;
+			}
+			var v = b64map.indexOf(s.charAt(i));
+			if (v < 0) {
+				continue;
+			}
+			if (k == 0) {
+				ret += int2char(v >> 2);
+				slop = v & 3;
+				k = 1;
+			} else if (k == 1) {
+				ret += int2char((slop << 2) | (v >> 4));
+				slop = v & 0xf;
+				k = 2;
+			} else if (k == 2) {
+				ret += int2char(slop);
+				ret += int2char(v >> 2);
+				slop = v & 3;
+				k = 3;
+			} else {
+				ret += int2char((slop << 2) | (v >> 4));
+				ret += int2char(v & 0xf);
+				k = 0;
+			}
+		}
+		if (k == 1) {
+			ret += int2char(slop << 2);
+		}
+		return ret;
+	}
+
+	/*! *****************************************************************************
+	Copyright (c) Microsoft Corporation. All rights reserved.
+	Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+	this file except in compliance with the License. You may obtain a copy of the
+	License at http://www.apache.org/licenses/LICENSE-2.0
+
+	THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+	KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+	WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+	MERCHANTABLITY OR NON-INFRINGEMENT.
+
+	See the Apache Version 2.0 License for specific language governing permissions
+	and limitations under the License.
+	***************************************************************************** */
+	/* global Reflect, Promise */
+
+	var extendStatics = function(d, b) {
+		extendStatics = Object.setPrototypeOf ||
+			({
+					__proto__: []
+				}
+				instanceof Array && function(d, b) {
+					d.__proto__ = b;
+				}) ||
+			function(d, b) {
+				for (var p in b)
+					if (b.hasOwnProperty(p)) d[p] = b[p];
+			};
+		return extendStatics(d, b);
+	};
+
+	function __extends(d, b) {
+		extendStatics(d, b);
+
+		function __() {
+			this.constructor = d;
+		}
+		d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+	}
+
+	// Hex JavaScript decoder
+	// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>
+	// Permission to use, copy, modify, and/or distribute this software for any
+	// purpose with or without fee is hereby granted, provided that the above
+	// copyright notice and this permission notice appear in all copies.
+	//
+	// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+	// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+	// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+	// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+	// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+	// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+	// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+	/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+	var decoder;
+	var Hex = {
+		decode: function(a) {
+			var i;
+			if (decoder === undefined) {
+				var hex = "0123456789ABCDEF";
+				var ignore = " \f\n\r\t\u00A0\u2028\u2029";
+				decoder = {};
+				for (i = 0; i < 16; ++i) {
+					decoder[hex.charAt(i)] = i;
+				}
+				hex = hex.toLowerCase();
+				for (i = 10; i < 16; ++i) {
+					decoder[hex.charAt(i)] = i;
+				}
+				for (i = 0; i < ignore.length; ++i) {
+					decoder[ignore.charAt(i)] = -1;
+				}
+			}
+			var out = [];
+			var bits = 0;
+			var char_count = 0;
+			for (i = 0; i < a.length; ++i) {
+				var c = a.charAt(i);
+				if (c == "=") {
+					break;
+				}
+				c = decoder[c];
+				if (c == -1) {
+					continue;
+				}
+				if (c === undefined) {
+					throw new Error("Illegal character at offset " + i);
+				}
+				bits |= c;
+				if (++char_count >= 2) {
+					out[out.length] = bits;
+					bits = 0;
+					char_count = 0;
+				} else {
+					bits <<= 4;
+				}
+			}
+			if (char_count) {
+				throw new Error("Hex encoding incomplete: 4 bits missing");
+			}
+			return out;
+		}
+	};
+
+	// Base64 JavaScript decoder
+	// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>
+	// Permission to use, copy, modify, and/or distribute this software for any
+	// purpose with or without fee is hereby granted, provided that the above
+	// copyright notice and this permission notice appear in all copies.
+	//
+	// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+	// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+	// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+	// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+	// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+	// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+	// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+	/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+	var decoder$1;
+	var Base64 = {
+		decode: function(a) {
+			var i;
+			if (decoder$1 === undefined) {
+				var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+				var ignore = "= \f\n\r\t\u00A0\u2028\u2029";
+				decoder$1 = Object.create(null);
+				for (i = 0; i < 64; ++i) {
+					decoder$1[b64.charAt(i)] = i;
+				}
+				for (i = 0; i < ignore.length; ++i) {
+					decoder$1[ignore.charAt(i)] = -1;
+				}
+			}
+			var out = [];
+			var bits = 0;
+			var char_count = 0;
+			for (i = 0; i < a.length; ++i) {
+				var c = a.charAt(i);
+				if (c == "=") {
+					break;
+				}
+				c = decoder$1[c];
+				if (c == -1) {
+					continue;
+				}
+				if (c === undefined) {
+					throw new Error("Illegal character at offset " + i);
+				}
+				bits |= c;
+				if (++char_count >= 4) {
+					out[out.length] = (bits >> 16);
+					out[out.length] = (bits >> 8) & 0xFF;
+					out[out.length] = bits & 0xFF;
+					bits = 0;
+					char_count = 0;
+				} else {
+					bits <<= 6;
+				}
+			}
+			switch (char_count) {
+				case 1:
+					throw new Error("Base64 encoding incomplete: at least 2 bits missing");
+				case 2:
+					out[out.length] = (bits >> 10);
+					break;
+				case 3:
+					out[out.length] = (bits >> 16);
+					out[out.length] = (bits >> 8) & 0xFF;
+					break;
+			}
+			return out;
+		},
+		re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,
+		unarmor: function(a) {
+			var m = Base64.re.exec(a);
+			if (m) {
+				if (m[1]) {
+					a = m[1];
+				} else if (m[2]) {
+					a = m[2];
+				} else {
+					throw new Error("RegExp out of sync");
+				}
+			}
+			return Base64.decode(a);
+		}
+	};
+
+	// Big integer base-10 printing library
+	// Copyright (c) 2014 Lapo Luchini <lapo@lapo.it>
+	// Permission to use, copy, modify, and/or distribute this software for any
+	// purpose with or without fee is hereby granted, provided that the above
+	// copyright notice and this permission notice appear in all copies.
+	//
+	// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+	// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+	// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+	// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+	// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+	// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+	// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+	/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+	var max = 10000000000000; // biggest integer that can still fit 2^53 when multiplied by 256
+	var Int10 = /** @class */ (function() {
+		function Int10(value) {
+			this.buf = [+value || 0];
+		}
+		Int10.prototype.mulAdd = function(m, c) {
+			// assert(m <= 256)
+			var b = this.buf;
+			var l = b.length;
+			var i;
+			var t;
+			for (i = 0; i < l; ++i) {
+				t = b[i] * m + c;
+				if (t < max) {
+					c = 0;
+				} else {
+					c = 0 | (t / max);
+					t -= c * max;
+				}
+				b[i] = t;
+			}
+			if (c > 0) {
+				b[i] = c;
+			}
+		};
+		Int10.prototype.sub = function(c) {
+			// assert(m <= 256)
+			var b = this.buf;
+			var l = b.length;
+			var i;
+			var t;
+			for (i = 0; i < l; ++i) {
+				t = b[i] - c;
+				if (t < 0) {
+					t += max;
+					c = 1;
+				} else {
+					c = 0;
+				}
+				b[i] = t;
+			}
+			while (b[b.length - 1] === 0) {
+				b.pop();
+			}
+		};
+		Int10.prototype.toString = function(base) {
+			if ((base || 10) != 10) {
+				throw new Error("only base 10 is supported");
+			}
+			var b = this.buf;
+			var s = b[b.length - 1].toString();
+			for (var i = b.length - 2; i >= 0; --i) {
+				s += (max + b[i]).toString().substring(1);
+			}
+			return s;
+		};
+		Int10.prototype.valueOf = function() {
+			var b = this.buf;
+			var v = 0;
+			for (var i = b.length - 1; i >= 0; --i) {
+				v = v * max + b[i];
+			}
+			return v;
+		};
+		Int10.prototype.simplify = function() {
+			var b = this.buf;
+			return (b.length == 1) ? b[0] : this;
+		};
+		return Int10;
+	}());
+
+	// ASN.1 JavaScript decoder
+	var ellipsis = "\u2026";
+	var reTimeS =
+		/^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
+	var reTimeL =
+		/^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
+
+	function stringCut(str, len) {
+		if (str.length > len) {
+			str = str.substring(0, len) + ellipsis;
+		}
+		return str;
+	}
+	var Stream = /** @class */ (function() {
+		function Stream(enc, pos) {
+			this.hexDigits = "0123456789ABCDEF";
+			if (enc instanceof Stream) {
+				this.enc = enc.enc;
+				this.pos = enc.pos;
+			} else {
+				// enc should be an array or a binary string
+				this.enc = enc;
+				this.pos = pos;
+			}
+		}
+		Stream.prototype.get = function(pos) {
+			if (pos === undefined) {
+				pos = this.pos++;
+			}
+			if (pos >= this.enc.length) {
+				throw new Error("Requesting byte offset " + pos + " on a stream of length " +
+					this.enc.length);
+			}
+			return ("string" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos];
+		};
+		Stream.prototype.hexByte = function(b) {
+			return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF);
+		};
+		Stream.prototype.hexDump = function(start, end, raw) {
+			var s = "";
+			for (var i = start; i < end; ++i) {
+				s += this.hexByte(this.get(i));
+				if (raw !== true) {
+					switch (i & 0xF) {
+						case 0x7:
+							s += "  ";
+							break;
+						case 0xF:
+							s += "\n";
+							break;
+						default:
+							s += " ";
+					}
+				}
+			}
+			return s;
+		};
+		Stream.prototype.isASCII = function(start, end) {
+			for (var i = start; i < end; ++i) {
+				var c = this.get(i);
+				if (c < 32 || c > 176) {
+					return false;
+				}
+			}
+			return true;
+		};
+		Stream.prototype.parseStringISO = function(start, end) {
+			var s = "";
+			for (var i = start; i < end; ++i) {
+				s += String.fromCharCode(this.get(i));
+			}
+			return s;
+		};
+		Stream.prototype.parseStringUTF = function(start, end) {
+			var s = "";
+			for (var i = start; i < end;) {
+				var c = this.get(i++);
+				if (c < 128) {
+					s += String.fromCharCode(c);
+				} else if ((c > 191) && (c < 224)) {
+					s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F));
+				} else {
+					s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) <<
+						6) | (this.get(i++) & 0x3F));
+				}
+			}
+			return s;
+		};
+		Stream.prototype.parseStringBMP = function(start, end) {
+			var str = "";
+			var hi;
+			var lo;
+			for (var i = start; i < end;) {
+				hi = this.get(i++);
+				lo = this.get(i++);
+				str += String.fromCharCode((hi << 8) | lo);
+			}
+			return str;
+		};
+		Stream.prototype.parseTime = function(start, end, shortYear) {
+			var s = this.parseStringISO(start, end);
+			var m = (shortYear ? reTimeS : reTimeL).exec(s);
+			if (!m) {
+				return "Unrecognized time: " + s;
+			}
+			if (shortYear) {
+				// to avoid querying the timer, use the fixed range [1970, 2069]
+				// it will conform with ITU X.400 [-10, +40] sliding window2 until 2030
+				m[1] = +m[1];
+				m[1] += (+m[1] < 70) ? 2000 : 1900;
+			}
+			s = m[1] + "-" + m[2] + "-" + m[3] + " " + m[4];
+			if (m[5]) {
+				s += ":" + m[5];
+				if (m[6]) {
+					s += ":" + m[6];
+					if (m[7]) {
+						s += "." + m[7];
+					}
+				}
+			}
+			if (m[8]) {
+				s += " UTC";
+				if (m[8] != "Z") {
+					s += m[8];
+					if (m[9]) {
+						s += ":" + m[9];
+					}
+				}
+			}
+			return s;
+		};
+		Stream.prototype.parseInteger = function(start, end) {
+			var v = this.get(start);
+			var neg = (v > 127);
+			var pad = neg ? 255 : 0;
+			var len;
+			var s = "";
+			// skip unuseful bits (not allowed in DER)
+			while (v == pad && ++start < end) {
+				v = this.get(start);
+			}
+			len = end - start;
+			if (len === 0) {
+				return neg ? -1 : 0;
+			}
+			// show bit length of huge integers
+			if (len > 4) {
+				s = v;
+				len <<= 3;
+				while (((+s ^ pad) & 0x80) == 0) {
+					s = +s << 1;
+					--len;
+				}
+				s = "(" + len + " bit)\n";
+			}
+			// decode the integer
+			if (neg) {
+				v = v - 256;
+			}
+			var n = new Int10(v);
+			for (var i = start + 1; i < end; ++i) {
+				n.mulAdd(256, this.get(i));
+			}
+			return s + n.toString();
+		};
+		Stream.prototype.parseBitString = function(start, end, maxLength) {
+			var unusedBit = this.get(start);
+			var lenBit = ((end - start - 1) << 3) - unusedBit;
+			var intro = "(" + lenBit + " bit)\n";
+			var s = "";
+			for (var i = start + 1; i < end; ++i) {
+				var b = this.get(i);
+				var skip = (i == end - 1) ? unusedBit : 0;
+				for (var j = 7; j >= skip; --j) {
+					s += (b >> j) & 1 ? "1" : "0";
+				}
+				if (s.length > maxLength) {
+					return intro + stringCut(s, maxLength);
+				}
+			}
+			return intro + s;
+		};
+		Stream.prototype.parseOctetString = function(start, end, maxLength) {
+			if (this.isASCII(start, end)) {
+				return stringCut(this.parseStringISO(start, end), maxLength);
+			}
+			var len = end - start;
+			var s = "(" + len + " byte)\n";
+			maxLength /= 2; // we work in bytes
+			if (len > maxLength) {
+				end = start + maxLength;
+			}
+			for (var i = start; i < end; ++i) {
+				s += this.hexByte(this.get(i));
+			}
+			if (len > maxLength) {
+				s += ellipsis;
+			}
+			return s;
+		};
+		Stream.prototype.parseOID = function(start, end, maxLength) {
+			var s = "";
+			var n = new Int10();
+			var bits = 0;
+			for (var i = start; i < end; ++i) {
+				var v = this.get(i);
+				n.mulAdd(128, v & 0x7F);
+				bits += 7;
+				if (!(v & 0x80)) { // finished
+					if (s === "") {
+						n = n.simplify();
+						if (n instanceof Int10) {
+							n.sub(80);
+							s = "2." + n.toString();
+						} else {
+							var m = n < 80 ? n < 40 ? 0 : 1 : 2;
+							s = m + "." + (n - m * 40);
+						}
+					} else {
+						s += "." + n.toString();
+					}
+					if (s.length > maxLength) {
+						return stringCut(s, maxLength);
+					}
+					n = new Int10();
+					bits = 0;
+				}
+			}
+			if (bits > 0) {
+				s += ".incomplete";
+			}
+			return s;
+		};
+		return Stream;
+	}());
+	var ASN1 = /** @class */ (function() {
+		function ASN1(stream, header, length, tag, sub) {
+			if (!(tag instanceof ASN1Tag)) {
+				throw new Error("Invalid tag value.");
+			}
+			this.stream = stream;
+			this.header = header;
+			this.length = length;
+			this.tag = tag;
+			this.sub = sub;
+		}
+		ASN1.prototype.typeName = function() {
+			switch (this.tag.tagClass) {
+				case 0: // universal
+					switch (this.tag.tagNumber) {
+						case 0x00:
+							return "EOC";
+						case 0x01:
+							return "BOOLEAN";
+						case 0x02:
+							return "INTEGER";
+						case 0x03:
+							return "BIT_STRING";
+						case 0x04:
+							return "OCTET_STRING";
+						case 0x05:
+							return "NULL";
+						case 0x06:
+							return "OBJECT_IDENTIFIER";
+						case 0x07:
+							return "ObjectDescriptor";
+						case 0x08:
+							return "EXTERNAL";
+						case 0x09:
+							return "REAL";
+						case 0x0A:
+							return "ENUMERATED";
+						case 0x0B:
+							return "EMBEDDED_PDV";
+						case 0x0C:
+							return "UTF8String";
+						case 0x10:
+							return "SEQUENCE";
+						case 0x11:
+							return "SET";
+						case 0x12:
+							return "NumericString";
+						case 0x13:
+							return "PrintableString"; // ASCII subset
+						case 0x14:
+							return "TeletexString"; // aka T61String
+						case 0x15:
+							return "VideotexString";
+						case 0x16:
+							return "IA5String"; // ASCII
+						case 0x17:
+							return "UTCTime";
+						case 0x18:
+							return "GeneralizedTime";
+						case 0x19:
+							return "GraphicString";
+						case 0x1A:
+							return "VisibleString"; // ASCII subset
+						case 0x1B:
+							return "GeneralString";
+						case 0x1C:
+							return "UniversalString";
+						case 0x1E:
+							return "BMPString";
+					}
+					return "Universal_" + this.tag.tagNumber.toString();
+				case 1:
+					return "Application_" + this.tag.tagNumber.toString();
+				case 2:
+					return "[" + this.tag.tagNumber.toString() + "]"; // Context
+				case 3:
+					return "Private_" + this.tag.tagNumber.toString();
+			}
+		};
+		ASN1.prototype.content = function(maxLength) {
+			if (this.tag === undefined) {
+				return null;
+			}
+			if (maxLength === undefined) {
+				maxLength = Infinity;
+			}
+			var content = this.posContent();
+			var len = Math.abs(this.length);
+			if (!this.tag.isUniversal()) {
+				if (this.sub !== null) {
+					return "(" + this.sub.length + " elem)";
+				}
+				return this.stream.parseOctetString(content, content + len, maxLength);
+			}
+			switch (this.tag.tagNumber) {
+				case 0x01: // BOOLEAN
+					return (this.stream.get(content) === 0) ? "false" : "true";
+				case 0x02: // INTEGER
+					return this.stream.parseInteger(content, content + len);
+				case 0x03: // BIT_STRING
+					return this.sub ? "(" + this.sub.length + " elem)" :
+						this.stream.parseBitString(content, content + len, maxLength);
+				case 0x04: // OCTET_STRING
+					return this.sub ? "(" + this.sub.length + " elem)" :
+						this.stream.parseOctetString(content, content + len, maxLength);
+					// case 0x05: // NULL
+				case 0x06: // OBJECT_IDENTIFIER
+					return this.stream.parseOID(content, content + len, maxLength);
+					// case 0x07: // ObjectDescriptor
+					// case 0x08: // EXTERNAL
+					// case 0x09: // REAL
+					// case 0x0A: // ENUMERATED
+					// case 0x0B: // EMBEDDED_PDV
+				case 0x10: // SEQUENCE
+				case 0x11: // SET
+					if (this.sub !== null) {
+						return "(" + this.sub.length + " elem)";
+					} else {
+						return "(no elem)";
+					}
+					case 0x0C: // UTF8String
+						return stringCut(this.stream.parseStringUTF(content, content + len),
+							maxLength);
+					case 0x12: // NumericString
+					case 0x13: // PrintableString
+					case 0x14: // TeletexString
+					case 0x15: // VideotexString
+					case 0x16: // IA5String
+						// case 0x19: // GraphicString
+					case 0x1A: // VisibleString
+						// case 0x1B: // GeneralString
+						// case 0x1C: // UniversalString
+						return stringCut(this.stream.parseStringISO(content, content + len),
+							maxLength);
+					case 0x1E: // BMPString
+						return stringCut(this.stream.parseStringBMP(content, content + len),
+							maxLength);
+					case 0x17: // UTCTime
+					case 0x18: // GeneralizedTime
+						return this.stream.parseTime(content, content + len, (this.tag
+							.tagNumber == 0x17));
+			}
+			return null;
+		};
+		ASN1.prototype.toString = function() {
+			return this.typeName() + "@" + this.stream.pos + "[header:" + this.header +
+				",length:" + this.length + ",sub:" + ((this.sub === null) ? "null" : this.sub
+					.length) + "]";
+		};
+		ASN1.prototype.toPrettyString = function(indent) {
+			if (indent === undefined) {
+				indent = "";
+			}
+			var s = indent + this.typeName() + " @" + this.stream.pos;
+			if (this.length >= 0) {
+				s += "+";
+			}
+			s += this.length;
+			if (this.tag.tagConstructed) {
+				s += " (constructed)";
+			} else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag
+					.tagNumber == 0x04))) && (this.sub !== null)) {
+				s += " (encapsulates)";
+			}
+			s += "\n";
+			if (this.sub !== null) {
+				indent += "  ";
+				for (var i = 0, max = this.sub.length; i < max; ++i) {
+					s += this.sub[i].toPrettyString(indent);
+				}
+			}
+			return s;
+		};
+		ASN1.prototype.posStart = function() {
+			return this.stream.pos;
+		};
+		ASN1.prototype.posContent = function() {
+			return this.stream.pos + this.header;
+		};
+		ASN1.prototype.posEnd = function() {
+			return this.stream.pos + this.header + Math.abs(this.length);
+		};
+		ASN1.prototype.toHexString = function() {
+			return this.stream.hexDump(this.posStart(), this.posEnd(), true);
+		};
+		ASN1.decodeLength = function(stream) {
+			var buf = stream.get();
+			var len = buf & 0x7F;
+			if (len == buf) {
+				return len;
+			}
+			// no reason to use Int10, as it would be a huge buffer anyways
+			if (len > 6) {
+				throw new Error("Length over 48 bits not supported at position " + (stream.pos -
+					1));
+			}
+			if (len === 0) {
+				return null;
+			} // undefined
+			buf = 0;
+			for (var i = 0; i < len; ++i) {
+				buf = (buf * 256) + stream.get();
+			}
+			return buf;
+		};
+		/**
+		 * Retrieve the hexadecimal value (as a string) of the current ASN.1 element
+		 * @returns {string}
+		 * @public
+		 */
+		ASN1.prototype.getHexStringValue = function() {
+			var hexString = this.toHexString();
+			var offset = this.header * 2;
+			var length = this.length * 2;
+			return hexString.substr(offset, length);
+		};
+		ASN1.decode = function(str) {
+			var stream;
+			if (!(str instanceof Stream)) {
+				stream = new Stream(str, 0);
+			} else {
+				stream = str;
+			}
+			var streamStart = new Stream(stream);
+			var tag = new ASN1Tag(stream);
+			var len = ASN1.decodeLength(stream);
+			var start = stream.pos;
+			var header = start - streamStart.pos;
+			var sub = null;
+			var getSub = function() {
+				var ret = [];
+				if (len !== null) {
+					// definite length
+					var end = start + len;
+					while (stream.pos < end) {
+						ret[ret.length] = ASN1.decode(stream);
+					}
+					if (stream.pos != end) {
+						throw new Error(
+							"Content size is not correct for container starting at offset " +
+							start);
+					}
+				} else {
+					// undefined length
+					try {
+						for (;;) {
+							var s = ASN1.decode(stream);
+							if (s.tag.isEOC()) {
+								break;
+							}
+							ret[ret.length] = s;
+						}
+						len = start - stream
+						.pos; // undefined lengths are represented as negative values
+					} catch (e) {
+						throw new Error(
+							"Exception while decoding undefined length content: " + e);
+					}
+				}
+				return ret;
+			};
+			if (tag.tagConstructed) {
+				// must have valid content
+				sub = getSub();
+			} else if (tag.isUniversal() && ((tag.tagNumber == 0x03) || (tag.tagNumber ==
+				0x04))) {
+				// sometimes BitString and OctetString are used to encapsulate ASN.1
+				try {
+					if (tag.tagNumber == 0x03) {
+						if (stream.get() != 0) {
+							throw new Error("BIT STRINGs with unused bits cannot encapsulate.");
+						}
+					}
+					sub = getSub();
+					for (var i = 0; i < sub.length; ++i) {
+						if (sub[i].tag.isEOC()) {
+							throw new Error("EOC is not supposed to be actual content.");
+						}
+					}
+				} catch (e) {
+					// but silently ignore when they don't
+					sub = null;
+				}
+			}
+			if (sub === null) {
+				if (len === null) {
+					throw new Error(
+						"We can't skip over an invalid tag with undefined length at offset " +
+						start);
+				}
+				stream.pos = start + Math.abs(len);
+			}
+			return new ASN1(streamStart, header, len, tag, sub);
+		};
+		return ASN1;
+	}());
+	var ASN1Tag = /** @class */ (function() {
+		function ASN1Tag(stream) {
+			var buf = stream.get();
+			this.tagClass = buf >> 6;
+			this.tagConstructed = ((buf & 0x20) !== 0);
+			this.tagNumber = buf & 0x1F;
+			if (this.tagNumber == 0x1F) { // long tag
+				var n = new Int10();
+				do {
+					buf = stream.get();
+					n.mulAdd(128, buf & 0x7F);
+				} while (buf & 0x80);
+				this.tagNumber = n.simplify();
+			}
+		}
+		ASN1Tag.prototype.isUniversal = function() {
+			return this.tagClass === 0x00;
+		};
+		ASN1Tag.prototype.isEOC = function() {
+			return this.tagClass === 0x00 && this.tagNumber === 0x00;
+		};
+		return ASN1Tag;
+	}());
+
+	// Copyright (c) 2005  Tom Wu
+	// Bits per digit
+	var dbits;
+	// JavaScript engine analysis
+	var canary = 0xdeadbeefcafe;
+	var j_lm = ((canary & 0xffffff) == 0xefcafe);
+	//#region
+	var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
+		89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181,
+		191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283,
+		293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
+		419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523,
+		541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647,
+		653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773,
+		787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
+		919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997
+	];
+	var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
+	//#endregion
+	// (public) Constructor
+	var BigInteger = /** @class */ (function() {
+		function BigInteger(a, b, c) {
+			if (a != null) {
+				if ("number" == typeof a) {
+					this.fromNumber(a, b, c);
+				} else if (b == null && "string" != typeof a) {
+					this.fromString(a, 256);
+				} else {
+					this.fromString(a, b);
+				}
+			}
+		}
+		//#region PUBLIC
+		// BigInteger.prototype.toString = bnToString;
+		// (public) return string representation in given radix
+		BigInteger.prototype.toString = function(b) {
+			if (this.s < 0) {
+				return "-" + this.negate().toString(b);
+			}
+			var k;
+			if (b == 16) {
+				k = 4;
+			} else if (b == 8) {
+				k = 3;
+			} else if (b == 2) {
+				k = 1;
+			} else if (b == 32) {
+				k = 5;
+			} else if (b == 4) {
+				k = 2;
+			} else {
+				return this.toRadix(b);
+			}
+			var km = (1 << k) - 1;
+			var d;
+			var m = false;
+			var r = "";
+			var i = this.t;
+			var p = this.DB - (i * this.DB) % k;
+			if (i-- > 0) {
+				if (p < this.DB && (d = this[i] >> p) > 0) {
+					m = true;
+					r = int2char(d);
+				}
+				while (i >= 0) {
+					if (p < k) {
+						d = (this[i] & ((1 << p) - 1)) << (k - p);
+						d |= this[--i] >> (p += this.DB - k);
+					} else {
+						d = (this[i] >> (p -= k)) & km;
+						if (p <= 0) {
+							p += this.DB;
+							--i;
+						}
+					}
+					if (d > 0) {
+						m = true;
+					}
+					if (m) {
+						r += int2char(d);
+					}
+				}
+			}
+			return m ? r : "0";
+		};
+		// BigInteger.prototype.negate = bnNegate;
+		// (public) -this
+		BigInteger.prototype.negate = function() {
+			var r = nbi();
+			BigInteger.ZERO.subTo(this, r);
+			return r;
+		};
+		// BigInteger.prototype.abs = bnAbs;
+		// (public) |this|
+		BigInteger.prototype.abs = function() {
+			return (this.s < 0) ? this.negate() : this;
+		};
+		// BigInteger.prototype.compareTo = bnCompareTo;
+		// (public) return + if this > a, - if this < a, 0 if equal
+		BigInteger.prototype.compareTo = function(a) {
+			var r = this.s - a.s;
+			if (r != 0) {
+				return r;
+			}
+			var i = this.t;
+			r = i - a.t;
+			if (r != 0) {
+				return (this.s < 0) ? -r : r;
+			}
+			while (--i >= 0) {
+				if ((r = this[i] - a[i]) != 0) {
+					return r;
+				}
+			}
+			return 0;
+		};
+		// BigInteger.prototype.bitLength = bnBitLength;
+		// (public) return the number of bits in "this"
+		BigInteger.prototype.bitLength = function() {
+			if (this.t <= 0) {
+				return 0;
+			}
+			return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));
+		};
+		// BigInteger.prototype.mod = bnMod;
+		// (public) this mod a
+		BigInteger.prototype.mod = function(a) {
+			var r = nbi();
+			this.abs().divRemTo(a, null, r);
+			if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {
+				a.subTo(r, r);
+			}
+			return r;
+		};
+		// BigInteger.prototype.modPowInt = bnModPowInt;
+		// (public) this^e % m, 0 <= e < 2^32
+		BigInteger.prototype.modPowInt = function(e, m) {
+			var z;
+			if (e < 256 || m.isEven()) {
+				z = new Classic(m);
+			} else {
+				z = new Montgomery(m);
+			}
+			return this.exp(e, z);
+		};
+		// BigInteger.prototype.clone = bnClone;
+		// (public)
+		BigInteger.prototype.clone = function() {
+			var r = nbi();
+			this.copyTo(r);
+			return r;
+		};
+		// BigInteger.prototype.intValue = bnIntValue;
+		// (public) return value as integer
+		BigInteger.prototype.intValue = function() {
+			if (this.s < 0) {
+				if (this.t == 1) {
+					return this[0] - this.DV;
+				} else if (this.t == 0) {
+					return -1;
+				}
+			} else if (this.t == 1) {
+				return this[0];
+			} else if (this.t == 0) {
+				return 0;
+			}
+			// assumes 16 < DB < 32
+			return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];
+		};
+		// BigInteger.prototype.byteValue = bnByteValue;
+		// (public) return value as byte
+		BigInteger.prototype.byteValue = function() {
+			return (this.t == 0) ? this.s : (this[0] << 24) >> 24;
+		};
+		// BigInteger.prototype.shortValue = bnShortValue;
+		// (public) return value as short (assumes DB>=16)
+		BigInteger.prototype.shortValue = function() {
+			return (this.t == 0) ? this.s : (this[0] << 16) >> 16;
+		};
+		// BigInteger.prototype.signum = bnSigNum;
+		// (public) 0 if this == 0, 1 if this > 0
+		BigInteger.prototype.signum = function() {
+			if (this.s < 0) {
+				return -1;
+			} else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {
+				return 0;
+			} else {
+				return 1;
+			}
+		};
+		// BigInteger.prototype.toByteArray = bnToByteArray;
+		// (public) convert to bigendian byte array
+		BigInteger.prototype.toByteArray = function() {
+			var i = this.t;
+			var r = [];
+			r[0] = this.s;
+			var p = this.DB - (i * this.DB) % 8;
+			var d;
+			var k = 0;
+			if (i-- > 0) {
+				if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) {
+					r[k++] = d | (this.s << (this.DB - p));
+				}
+				while (i >= 0) {
+					if (p < 8) {
+						d = (this[i] & ((1 << p) - 1)) << (8 - p);
+						d |= this[--i] >> (p += this.DB - 8);
+					} else {
+						d = (this[i] >> (p -= 8)) & 0xff;
+						if (p <= 0) {
+							p += this.DB;
+							--i;
+						}
+					}
+					if ((d & 0x80) != 0) {
+						d |= -256;
+					}
+					if (k == 0 && (this.s & 0x80) != (d & 0x80)) {
+						++k;
+					}
+					if (k > 0 || d != this.s) {
+						r[k++] = d;
+					}
+				}
+			}
+			return r;
+		};
+		// BigInteger.prototype.equals = bnEquals;
+		BigInteger.prototype.equals = function(a) {
+			return (this.compareTo(a) == 0);
+		};
+		// BigInteger.prototype.min = bnMin;
+		BigInteger.prototype.min = function(a) {
+			return (this.compareTo(a) < 0) ? this : a;
+		};
+		// BigInteger.prototype.max = bnMax;
+		BigInteger.prototype.max = function(a) {
+			return (this.compareTo(a) > 0) ? this : a;
+		};
+		// BigInteger.prototype.and = bnAnd;
+		BigInteger.prototype.and = function(a) {
+			var r = nbi();
+			this.bitwiseTo(a, op_and, r);
+			return r;
+		};
+		// BigInteger.prototype.or = bnOr;
+		BigInteger.prototype.or = function(a) {
+			var r = nbi();
+			this.bitwiseTo(a, op_or, r);
+			return r;
+		};
+		// BigInteger.prototype.xor = bnXor;
+		BigInteger.prototype.xor = function(a) {
+			var r = nbi();
+			this.bitwiseTo(a, op_xor, r);
+			return r;
+		};
+		// BigInteger.prototype.andNot = bnAndNot;
+		BigInteger.prototype.andNot = function(a) {
+			var r = nbi();
+			this.bitwiseTo(a, op_andnot, r);
+			return r;
+		};
+		// BigInteger.prototype.not = bnNot;
+		// (public) ~this
+		BigInteger.prototype.not = function() {
+			var r = nbi();
+			for (var i = 0; i < this.t; ++i) {
+				r[i] = this.DM & ~this[i];
+			}
+			r.t = this.t;
+			r.s = ~this.s;
+			return r;
+		};
+		// BigInteger.prototype.shiftLeft = bnShiftLeft;
+		// (public) this << n
+		BigInteger.prototype.shiftLeft = function(n) {
+			var r = nbi();
+			if (n < 0) {
+				this.rShiftTo(-n, r);
+			} else {
+				this.lShiftTo(n, r);
+			}
+			return r;
+		};
+		// BigInteger.prototype.shiftRight = bnShiftRight;
+		// (public) this >> n
+		BigInteger.prototype.shiftRight = function(n) {
+			var r = nbi();
+			if (n < 0) {
+				this.lShiftTo(-n, r);
+			} else {
+				this.rShiftTo(n, r);
+			}
+			return r;
+		};
+		// BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
+		// (public) returns index of lowest 1-bit (or -1 if none)
+		BigInteger.prototype.getLowestSetBit = function() {
+			for (var i = 0; i < this.t; ++i) {
+				if (this[i] != 0) {
+					return i * this.DB + lbit(this[i]);
+				}
+			}
+			if (this.s < 0) {
+				return this.t * this.DB;
+			}
+			return -1;
+		};
+		// BigInteger.prototype.bitCount = bnBitCount;
+		// (public) return number of set bits
+		BigInteger.prototype.bitCount = function() {
+			var r = 0;
+			var x = this.s & this.DM;
+			for (var i = 0; i < this.t; ++i) {
+				r += cbit(this[i] ^ x);
+			}
+			return r;
+		};
+		// BigInteger.prototype.testBit = bnTestBit;
+		// (public) true iff nth bit is set
+		BigInteger.prototype.testBit = function(n) {
+			var j = Math.floor(n / this.DB);
+			if (j >= this.t) {
+				return (this.s != 0);
+			}
+			return ((this[j] & (1 << (n % this.DB))) != 0);
+		};
+		// BigInteger.prototype.setBit = bnSetBit;
+		// (public) this | (1<<n)
+		BigInteger.prototype.setBit = function(n) {
+			return this.changeBit(n, op_or);
+		};
+		// BigInteger.prototype.clearBit = bnClearBit;
+		// (public) this & ~(1<<n)
+		BigInteger.prototype.clearBit = function(n) {
+			return this.changeBit(n, op_andnot);
+		};
+		// BigInteger.prototype.flipBit = bnFlipBit;
+		// (public) this ^ (1<<n)
+		BigInteger.prototype.flipBit = function(n) {
+			return this.changeBit(n, op_xor);
+		};
+		// BigInteger.prototype.add = bnAdd;
+		// (public) this + a
+		BigInteger.prototype.add = function(a) {
+			var r = nbi();
+			this.addTo(a, r);
+			return r;
+		};
+		// BigInteger.prototype.subtract = bnSubtract;
+		// (public) this - a
+		BigInteger.prototype.subtract = function(a) {
+			var r = nbi();
+			this.subTo(a, r);
+			return r;
+		};
+		// BigInteger.prototype.multiply = bnMultiply;
+		// (public) this * a
+		BigInteger.prototype.multiply = function(a) {
+			var r = nbi();
+			this.multiplyTo(a, r);
+			return r;
+		};
+		// BigInteger.prototype.divide = bnDivide;
+		// (public) this / a
+		BigInteger.prototype.divide = function(a) {
+			var r = nbi();
+			this.divRemTo(a, r, null);
+			return r;
+		};
+		// BigInteger.prototype.remainder = bnRemainder;
+		// (public) this % a
+		BigInteger.prototype.remainder = function(a) {
+			var r = nbi();
+			this.divRemTo(a, null, r);
+			return r;
+		};
+		// BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
+		// (public) [this/a,this%a]
+		BigInteger.prototype.divideAndRemainder = function(a) {
+			var q = nbi();
+			var r = nbi();
+			this.divRemTo(a, q, r);
+			return [q, r];
+		};
+		// BigInteger.prototype.modPow = bnModPow;
+		// (public) this^e % m (HAC 14.85)
+		BigInteger.prototype.modPow = function(e, m) {
+			console.log(arguments)
+			var i = e.bitLength();
+			var k;
+			var r = nbv(1);
+			var z;
+			if (i <= 0) {
+				return r;
+			} else if (i < 18) {
+				k = 1;
+			} else if (i < 48) {
+				k = 3;
+			} else if (i < 144) {
+				k = 4;
+			} else if (i < 768) {
+				k = 5;
+			} else {
+				k = 6;
+			}
+			if (i < 8) {
+				z = new Classic(m);
+			} else if (m.isEven()) {
+				z = new Barrett(m);
+			} else {
+				z = new Montgomery(m);
+			}
+			// precomputation
+			var g = [];
+			var n = 3;
+			var k1 = k - 1;
+			var km = (1 << k) - 1;
+			g[1] = z.convert(this);
+			if (k > 1) {
+				var g2 = nbi();
+				z.sqrTo(g[1], g2);
+				while (n <= km) {
+					g[n] = nbi();
+					z.mulTo(g2, g[n - 2], g[n]);
+					n += 2;
+				}
+			}
+			var j = e.t - 1;
+			var w;
+			var is1 = true;
+			var r2 = nbi();
+			var t;
+			i = nbits(e[j]) - 1;
+			while (j >= 0) {
+				if (i >= k1) {
+					w = (e[j] >> (i - k1)) & km;
+				} else {
+					w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
+					if (j > 0) {
+						w |= e[j - 1] >> (this.DB + i - k1);
+					}
+				}
+				n = k;
+				while ((w & 1) == 0) {
+					w >>= 1;
+					--n;
+				}
+				if ((i -= n) < 0) {
+					i += this.DB;
+					--j;
+				}
+				if (is1) { // ret == 1, don't bother squaring or multiplying it
+					g[w].copyTo(r);
+					is1 = false;
+				} else {
+					while (n > 1) {
+						z.sqrTo(r, r2);
+						z.sqrTo(r2, r);
+						n -= 2;
+					}
+					if (n > 0) {
+						z.sqrTo(r, r2);
+					} else {
+						t = r;
+						r = r2;
+						r2 = t;
+					}
+					z.mulTo(r2, g[w], r);
+				}
+				while (j >= 0 && (e[j] & (1 << i)) == 0) {
+					z.sqrTo(r, r2);
+					t = r;
+					r = r2;
+					r2 = t;
+					if (--i < 0) {
+						i = this.DB - 1;
+						--j;
+					}
+				}
+			}
+			return z.revert(r);
+		};
+		// BigInteger.prototype.modInverse = bnModInverse;
+		// (public) 1/this % m (HAC 14.61)
+		BigInteger.prototype.modInverse = function(m) {
+			var ac = m.isEven();
+			if ((this.isEven() && ac) || m.signum() == 0) {
+				return BigInteger.ZERO;
+			}
+			var u = m.clone();
+			var v = this.clone();
+			var a = nbv(1);
+			var b = nbv(0);
+			var c = nbv(0);
+			var d = nbv(1);
+			while (u.signum() != 0) {
+				while (u.isEven()) {
+					u.rShiftTo(1, u);
+					if (ac) {
+						if (!a.isEven() || !b.isEven()) {
+							a.addTo(this, a);
+							b.subTo(m, b);
+						}
+						a.rShiftTo(1, a);
+					} else if (!b.isEven()) {
+						b.subTo(m, b);
+					}
+					b.rShiftTo(1, b);
+				}
+				while (v.isEven()) {
+					v.rShiftTo(1, v);
+					if (ac) {
+						if (!c.isEven() || !d.isEven()) {
+							c.addTo(this, c);
+							d.subTo(m, d);
+						}
+						c.rShiftTo(1, c);
+					} else if (!d.isEven()) {
+						d.subTo(m, d);
+					}
+					d.rShiftTo(1, d);
+				}
+				if (u.compareTo(v) >= 0) {
+					u.subTo(v, u);
+					if (ac) {
+						a.subTo(c, a);
+					}
+					b.subTo(d, b);
+				} else {
+					v.subTo(u, v);
+					if (ac) {
+						c.subTo(a, c);
+					}
+					d.subTo(b, d);
+				}
+			}
+			if (v.compareTo(BigInteger.ONE) != 0) {
+				return BigInteger.ZERO;
+			}
+			if (d.compareTo(m) >= 0) {
+				return d.subtract(m);
+			}
+			if (d.signum() < 0) {
+				d.addTo(m, d);
+			} else {
+				return d;
+			}
+			if (d.signum() < 0) {
+				return d.add(m);
+			} else {
+				return d;
+			}
+		};
+		// BigInteger.prototype.pow = bnPow;
+		// (public) this^e
+		BigInteger.prototype.pow = function(e) {
+			return this.exp(e, new NullExp());
+		};
+		// BigInteger.prototype.gcd = bnGCD;
+		// (public) gcd(this,a) (HAC 14.54)
+		BigInteger.prototype.gcd = function(a) {
+			var x = (this.s < 0) ? this.negate() : this.clone();
+			var y = (a.s < 0) ? a.negate() : a.clone();
+			if (x.compareTo(y) < 0) {
+				var t = x;
+				x = y;
+				y = t;
+			}
+			var i = x.getLowestSetBit();
+			var g = y.getLowestSetBit();
+			if (g < 0) {
+				return x;
+			}
+			if (i < g) {
+				g = i;
+			}
+			if (g > 0) {
+				x.rShiftTo(g, x);
+				y.rShiftTo(g, y);
+			}
+			while (x.signum() > 0) {
+				if ((i = x.getLowestSetBit()) > 0) {
+					x.rShiftTo(i, x);
+				}
+				if ((i = y.getLowestSetBit()) > 0) {
+					y.rShiftTo(i, y);
+				}
+				if (x.compareTo(y) >= 0) {
+					x.subTo(y, x);
+					x.rShiftTo(1, x);
+				} else {
+					y.subTo(x, y);
+					y.rShiftTo(1, y);
+				}
+			}
+			if (g > 0) {
+				y.lShiftTo(g, y);
+			}
+			return y;
+		};
+		// BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
+		// (public) test primality with certainty >= 1-.5^t
+		BigInteger.prototype.isProbablePrime = function(t) {
+			var i;
+			var x = this.abs();
+			if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {
+				for (i = 0; i < lowprimes.length; ++i) {
+					if (x[0] == lowprimes[i]) {
+						return true;
+					}
+				}
+				return false;
+			}
+			if (x.isEven()) {
+				return false;
+			}
+			i = 1;
+			while (i < lowprimes.length) {
+				var m = lowprimes[i];
+				var j = i + 1;
+				while (j < lowprimes.length && m < lplim) {
+					m *= lowprimes[j++];
+				}
+				m = x.modInt(m);
+				while (i < j) {
+					if (m % lowprimes[i++] == 0) {
+						return false;
+					}
+				}
+			}
+			return x.millerRabin(t);
+		};
+		//#endregion PUBLIC
+		//#region PROTECTED
+		// BigInteger.prototype.copyTo = bnpCopyTo;
+		// (protected) copy this to r
+		BigInteger.prototype.copyTo = function(r) {
+			for (var i = this.t - 1; i >= 0; --i) {
+				r[i] = this[i];
+			}
+			r.t = this.t;
+			r.s = this.s;
+		};
+		// BigInteger.prototype.fromInt = bnpFromInt;
+		// (protected) set from integer value x, -DV <= x < DV
+		BigInteger.prototype.fromInt = function(x) {
+			this.t = 1;
+			this.s = (x < 0) ? -1 : 0;
+			if (x > 0) {
+				this[0] = x;
+			} else if (x < -1) {
+				this[0] = x + this.DV;
+			} else {
+				this.t = 0;
+			}
+		};
+		// BigInteger.prototype.fromString = bnpFromString;
+		// (protected) set from string and radix
+		BigInteger.prototype.fromString = function(s, b) {
+			var k;
+			if (b == 16) {
+				k = 4;
+			} else if (b == 8) {
+				k = 3;
+			} else if (b == 256) {
+				k = 8;
+				/* byte array */
+			} else if (b == 2) {
+				k = 1;
+			} else if (b == 32) {
+				k = 5;
+			} else if (b == 4) {
+				k = 2;
+			} else {
+				this.fromRadix(s, b);
+				return;
+			}
+			this.t = 0;
+			this.s = 0;
+			var i = s.length;
+			var mi = false;
+			var sh = 0;
+			while (--i >= 0) {
+				var x = (k == 8) ? (+s[i]) & 0xff : intAt(s, i);
+				if (x < 0) {
+					if (s.charAt(i) == "-") {
+						mi = true;
+					}
+					continue;
+				}
+				mi = false;
+				if (sh == 0) {
+					this[this.t++] = x;
+				} else if (sh + k > this.DB) {
+					this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;
+					this[this.t++] = (x >> (this.DB - sh));
+				} else {
+					this[this.t - 1] |= x << sh;
+				}
+				sh += k;
+				if (sh >= this.DB) {
+					sh -= this.DB;
+				}
+			}
+			if (k == 8 && ((+s[0]) & 0x80) != 0) {
+				this.s = -1;
+				if (sh > 0) {
+					this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;
+				}
+			}
+			this.clamp();
+			if (mi) {
+				BigInteger.ZERO.subTo(this, this);
+			}
+		};
+		// BigInteger.prototype.clamp = bnpClamp;
+		// (protected) clamp off excess high words
+		BigInteger.prototype.clamp = function() {
+			var c = this.s & this.DM;
+			while (this.t > 0 && this[this.t - 1] == c) {
+				--this.t;
+			}
+		};
+		// BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
+		// (protected) r = this << n*DB
+		BigInteger.prototype.dlShiftTo = function(n, r) {
+			var i;
+			for (i = this.t - 1; i >= 0; --i) {
+				r[i + n] = this[i];
+			}
+			for (i = n - 1; i >= 0; --i) {
+				r[i] = 0;
+			}
+			r.t = this.t + n;
+			r.s = this.s;
+		};
+		// BigInteger.prototype.drShiftTo = bnpDRShiftTo;
+		// (protected) r = this >> n*DB
+		BigInteger.prototype.drShiftTo = function(n, r) {
+			for (var i = n; i < this.t; ++i) {
+				r[i - n] = this[i];
+			}
+			r.t = Math.max(this.t - n, 0);
+			r.s = this.s;
+		};
+		// BigInteger.prototype.lShiftTo = bnpLShiftTo;
+		// (protected) r = this << n
+		BigInteger.prototype.lShiftTo = function(n, r) {
+			var bs = n % this.DB;
+			var cbs = this.DB - bs;
+			var bm = (1 << cbs) - 1;
+			var ds = Math.floor(n / this.DB);
+			var c = (this.s << bs) & this.DM;
+			for (var i = this.t - 1; i >= 0; --i) {
+				r[i + ds + 1] = (this[i] >> cbs) | c;
+				c = (this[i] & bm) << bs;
+			}
+			for (var i = ds - 1; i >= 0; --i) {
+				r[i] = 0;
+			}
+			r[ds] = c;
+			r.t = this.t + ds + 1;
+			r.s = this.s;
+			r.clamp();
+		};
+		// BigInteger.prototype.rShiftTo = bnpRShiftTo;
+		// (protected) r = this >> n
+		BigInteger.prototype.rShiftTo = function(n, r) {
+			r.s = this.s;
+			var ds = Math.floor(n / this.DB);
+			if (ds >= this.t) {
+				r.t = 0;
+				return;
+			}
+			var bs = n % this.DB;
+			var cbs = this.DB - bs;
+			var bm = (1 << bs) - 1;
+			r[0] = this[ds] >> bs;
+			for (var i = ds + 1; i < this.t; ++i) {
+				r[i - ds - 1] |= (this[i] & bm) << cbs;
+				r[i - ds] = this[i] >> bs;
+			}
+			if (bs > 0) {
+				r[this.t - ds - 1] |= (this.s & bm) << cbs;
+			}
+			r.t = this.t - ds;
+			r.clamp();
+		};
+		// BigInteger.prototype.subTo = bnpSubTo;
+		// (protected) r = this - a
+		BigInteger.prototype.subTo = function(a, r) {
+			var i = 0;
+			var c = 0;
+			var m = Math.min(a.t, this.t);
+			while (i < m) {
+				c += this[i] - a[i];
+				r[i++] = c & this.DM;
+				c >>= this.DB;
+			}
+			if (a.t < this.t) {
+				c -= a.s;
+				while (i < this.t) {
+					c += this[i];
+					r[i++] = c & this.DM;
+					c >>= this.DB;
+				}
+				c += this.s;
+			} else {
+				c += this.s;
+				while (i < a.t) {
+					c -= a[i];
+					r[i++] = c & this.DM;
+					c >>= this.DB;
+				}
+				c -= a.s;
+			}
+			r.s = (c < 0) ? -1 : 0;
+			if (c < -1) {
+				r[i++] = this.DV + c;
+			} else if (c > 0) {
+				r[i++] = c;
+			}
+			r.t = i;
+			r.clamp();
+		};
+		// BigInteger.prototype.multiplyTo = bnpMultiplyTo;
+		// (protected) r = this * a, r != this,a (HAC 14.12)
+		// "this" should be the larger one if appropriate.
+		BigInteger.prototype.multiplyTo = function(a, r) {
+			var x = this.abs();
+			var y = a.abs();
+			var i = x.t;
+			r.t = i + y.t;
+			while (--i >= 0) {
+				r[i] = 0;
+			}
+			for (i = 0; i < y.t; ++i) {
+				r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);
+			}
+			r.s = 0;
+			r.clamp();
+			if (this.s != a.s) {
+				BigInteger.ZERO.subTo(r, r);
+			}
+		};
+		// BigInteger.prototype.squareTo = bnpSquareTo;
+		// (protected) r = this^2, r != this (HAC 14.16)
+		BigInteger.prototype.squareTo = function(r) {
+			var x = this.abs();
+			var i = r.t = 2 * x.t;
+			while (--i >= 0) {
+				r[i] = 0;
+			}
+			for (i = 0; i < x.t - 1; ++i) {
+				var c = x.am(i, x[i], r, 2 * i, 0, 1);
+				if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x
+					.DV) {
+					r[i + x.t] -= x.DV;
+					r[i + x.t + 1] = 1;
+				}
+			}
+			if (r.t > 0) {
+				r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);
+			}
+			r.s = 0;
+			r.clamp();
+		};
+		// BigInteger.prototype.divRemTo = bnpDivRemTo;
+		// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
+		// r != q, this != m.  q or r may be null.
+		BigInteger.prototype.divRemTo = function(m, q, r) {
+			var pm = m.abs();
+			if (pm.t <= 0) {
+				return;
+			}
+			var pt = this.abs();
+			if (pt.t < pm.t) {
+				if (q != null) {
+					q.fromInt(0);
+				}
+				if (r != null) {
+					this.copyTo(r);
+				}
+				return;
+			}
+			if (r == null) {
+				r = nbi();
+			}
+			var y = nbi();
+			var ts = this.s;
+			var ms = m.s;
+			var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus
+			if (nsh > 0) {
+				pm.lShiftTo(nsh, y);
+				pt.lShiftTo(nsh, r);
+			} else {
+				pm.copyTo(y);
+				pt.copyTo(r);
+			}
+			var ys = y.t;
+			var y0 = y[ys - 1];
+			if (y0 == 0) {
+				return;
+			}
+			var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);
+			var d1 = this.FV / yt;
+			var d2 = (1 << this.F1) / yt;
+			var e = 1 << this.F2;
+			var i = r.t;
+			var j = i - ys;
+			var t = (q == null) ? nbi() : q;
+			y.dlShiftTo(j, t);
+			if (r.compareTo(t) >= 0) {
+				r[r.t++] = 1;
+				r.subTo(t, r);
+			}
+			BigInteger.ONE.dlShiftTo(ys, t);
+			t.subTo(y, y); // "negative" y so we can replace sub with am later
+			while (y.t < ys) {
+				y[y.t++] = 0;
+			}
+			while (--j >= 0) {
+				// Estimate quotient digit
+				var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);
+				if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out
+					y.dlShiftTo(j, t);
+					r.subTo(t, r);
+					while (r[i] < --qd) {
+						r.subTo(t, r);
+					}
+				}
+			}
+			if (q != null) {
+				r.drShiftTo(ys, q);
+				if (ts != ms) {
+					BigInteger.ZERO.subTo(q, q);
+				}
+			}
+			r.t = ys;
+			r.clamp();
+			if (nsh > 0) {
+				r.rShiftTo(nsh, r);
+			} // Denormalize remainder
+			if (ts < 0) {
+				BigInteger.ZERO.subTo(r, r);
+			}
+		};
+		// BigInteger.prototype.invDigit = bnpInvDigit;
+		// (protected) return "-1/this % 2^DB"; useful for Mont. reduction
+		// justification:
+		//         xy == 1 (mod m)
+		//         xy =  1+km
+		//   xy(2-xy) = (1+km)(1-km)
+		// x[y(2-xy)] = 1-k^2m^2
+		// x[y(2-xy)] == 1 (mod m^2)
+		// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
+		// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
+		// JS multiply "overflows" differently from C/C++, so care is needed here.
+		BigInteger.prototype.invDigit = function() {
+			if (this.t < 1) {
+				return 0;
+			}
+			var x = this[0];
+			if ((x & 1) == 0) {
+				return 0;
+			}
+			var y = x & 3; // y == 1/x mod 2^2
+			y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
+			y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8
+			y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16
+			// last step - calculate inverse mod DV directly;
+			// assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
+			y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits
+			// we really want the negative inverse, and -DV < y < DV
+			return (y > 0) ? this.DV - y : -y;
+		};
+		// BigInteger.prototype.isEven = bnpIsEven;
+		// (protected) true iff this is even
+		BigInteger.prototype.isEven = function() {
+			return ((this.t > 0) ? (this[0] & 1) : this.s) == 0;
+		};
+		// BigInteger.prototype.exp = bnpExp;
+		// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
+		BigInteger.prototype.exp = function(e, z) {
+			if (e > 0xffffffff || e < 1) {
+				return BigInteger.ONE;
+			}
+			var r = nbi();
+			var r2 = nbi();
+			var g = z.convert(this);
+			var i = nbits(e) - 1;
+			g.copyTo(r);
+			while (--i >= 0) {
+				z.sqrTo(r, r2);
+				if ((e & (1 << i)) > 0) {
+					z.mulTo(r2, g, r);
+				} else {
+					var t = r;
+					r = r2;
+					r2 = t;
+				}
+			}
+			return z.revert(r);
+		};
+		// BigInteger.prototype.chunkSize = bnpChunkSize;
+		// (protected) return x s.t. r^x < DV
+		BigInteger.prototype.chunkSize = function(r) {
+			return Math.floor(Math.LN2 * this.DB / Math.log(r));
+		};
+		// BigInteger.prototype.toRadix = bnpToRadix;
+		// (protected) convert to radix string
+		BigInteger.prototype.toRadix = function(b) {
+			if (b == null) {
+				b = 10;
+			}
+			if (this.signum() == 0 || b < 2 || b > 36) {
+				return "0";
+			}
+			var cs = this.chunkSize(b);
+			var a = Math.pow(b, cs);
+			var d = nbv(a);
+			var y = nbi();
+			var z = nbi();
+			var r = "";
+			this.divRemTo(d, y, z);
+			while (y.signum() > 0) {
+				r = (a + z.intValue()).toString(b).substr(1) + r;
+				y.divRemTo(d, y, z);
+			}
+			return z.intValue().toString(b) + r;
+		};
+		// BigInteger.prototype.fromRadix = bnpFromRadix;
+		// (protected) convert from radix string
+		BigInteger.prototype.fromRadix = function(s, b) {
+			this.fromInt(0);
+			if (b == null) {
+				b = 10;
+			}
+			var cs = this.chunkSize(b);
+			var d = Math.pow(b, cs);
+			var mi = false;
+			var j = 0;
+			var w = 0;
+			for (var i = 0; i < s.length; ++i) {
+				var x = intAt(s, i);
+				if (x < 0) {
+					if (s.charAt(i) == "-" && this.signum() == 0) {
+						mi = true;
+					}
+					continue;
+				}
+				w = b * w + x;
+				if (++j >= cs) {
+					this.dMultiply(d);
+					this.dAddOffset(w, 0);
+					j = 0;
+					w = 0;
+				}
+			}
+			if (j > 0) {
+				this.dMultiply(Math.pow(b, j));
+				this.dAddOffset(w, 0);
+			}
+			if (mi) {
+				BigInteger.ZERO.subTo(this, this);
+			}
+		};
+		// BigInteger.prototype.fromNumber = bnpFromNumber;
+		// (protected) alternate constructor
+		BigInteger.prototype.fromNumber = function(a, b, c) {
+			if ("number" == typeof b) {
+				// new BigInteger(int,int,RNG)
+				if (a < 2) {
+					this.fromInt(1);
+				} else {
+					this.fromNumber(a, c);
+					if (!this.testBit(a - 1)) {
+						// force MSB set
+						this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
+					}
+					if (this.isEven()) {
+						this.dAddOffset(1, 0);
+					} // force odd
+					while (!this.isProbablePrime(b)) {
+						this.dAddOffset(2, 0);
+						if (this.bitLength() > a) {
+							this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);
+						}
+					}
+				}
+			} else {
+				// new BigInteger(int,RNG)
+				var x = [];
+				var t = a & 7;
+				x.length = (a >> 3) + 1;
+				b.nextBytes(x);
+				if (t > 0) {
+					x[0] &= ((1 << t) - 1);
+				} else {
+					x[0] = 0;
+				}
+				this.fromString(x, 256);
+			}
+		};
+		// BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
+		// (protected) r = this op a (bitwise)
+		BigInteger.prototype.bitwiseTo = function(a, op, r) {
+			var i;
+			var f;
+			var m = Math.min(a.t, this.t);
+			for (i = 0; i < m; ++i) {
+				r[i] = op(this[i], a[i]);
+			}
+			if (a.t < this.t) {
+				f = a.s & this.DM;
+				for (i = m; i < this.t; ++i) {
+					r[i] = op(this[i], f);
+				}
+				r.t = this.t;
+			} else {
+				f = this.s & this.DM;
+				for (i = m; i < a.t; ++i) {
+					r[i] = op(f, a[i]);
+				}
+				r.t = a.t;
+			}
+			r.s = op(this.s, a.s);
+			r.clamp();
+		};
+		// BigInteger.prototype.changeBit = bnpChangeBit;
+		// (protected) this op (1<<n)
+		BigInteger.prototype.changeBit = function(n, op) {
+			var r = BigInteger.ONE.shiftLeft(n);
+			this.bitwiseTo(r, op, r);
+			return r;
+		};
+		// BigInteger.prototype.addTo = bnpAddTo;
+		// (protected) r = this + a
+		BigInteger.prototype.addTo = function(a, r) {
+			var i = 0;
+			var c = 0;
+			var m = Math.min(a.t, this.t);
+			while (i < m) {
+				c += this[i] + a[i];
+				r[i++] = c & this.DM;
+				c >>= this.DB;
+			}
+			if (a.t < this.t) {
+				c += a.s;
+				while (i < this.t) {
+					c += this[i];
+					r[i++] = c & this.DM;
+					c >>= this.DB;
+				}
+				c += this.s;
+			} else {
+				c += this.s;
+				while (i < a.t) {
+					c += a[i];
+					r[i++] = c & this.DM;
+					c >>= this.DB;
+				}
+				c += a.s;
+			}
+			r.s = (c < 0) ? -1 : 0;
+			if (c > 0) {
+				r[i++] = c;
+			} else if (c < -1) {
+				r[i++] = this.DV + c;
+			}
+			r.t = i;
+			r.clamp();
+		};
+		// BigInteger.prototype.dMultiply = bnpDMultiply;
+		// (protected) this *= n, this >= 0, 1 < n < DV
+		BigInteger.prototype.dMultiply = function(n) {
+			this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);
+			++this.t;
+			this.clamp();
+		};
+		// BigInteger.prototype.dAddOffset = bnpDAddOffset;
+		// (protected) this += n << w words, this >= 0
+		BigInteger.prototype.dAddOffset = function(n, w) {
+			if (n == 0) {
+				return;
+			}
+			while (this.t <= w) {
+				this[this.t++] = 0;
+			}
+			this[w] += n;
+			while (this[w] >= this.DV) {
+				this[w] -= this.DV;
+				if (++w >= this.t) {
+					this[this.t++] = 0;
+				}
+				++this[w];
+			}
+		};
+		// BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
+		// (protected) r = lower n words of "this * a", a.t <= n
+		// "this" should be the larger one if appropriate.
+		BigInteger.prototype.multiplyLowerTo = function(a, n, r) {
+			var i = Math.min(this.t + a.t, n);
+			r.s = 0; // assumes a,this >= 0
+			r.t = i;
+			while (i > 0) {
+				r[--i] = 0;
+			}
+			for (var j = r.t - this.t; i < j; ++i) {
+				r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);
+			}
+			for (var j = Math.min(a.t, n); i < j; ++i) {
+				this.am(0, a[i], r, i, 0, n - i);
+			}
+			r.clamp();
+		};
+		// BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
+		// (protected) r = "this * a" without lower n words, n > 0
+		// "this" should be the larger one if appropriate.
+		BigInteger.prototype.multiplyUpperTo = function(a, n, r) {
+			--n;
+			var i = r.t = this.t + a.t - n;
+			r.s = 0; // assumes a,this >= 0
+			while (--i >= 0) {
+				r[i] = 0;
+			}
+			for (i = Math.max(n - this.t, 0); i < a.t; ++i) {
+				r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);
+			}
+			r.clamp();
+			r.drShiftTo(1, r);
+		};
+		// BigInteger.prototype.modInt = bnpModInt;
+		// (protected) this % n, n < 2^26
+		BigInteger.prototype.modInt = function(n) {
+			if (n <= 0) {
+				return 0;
+			}
+			var d = this.DV % n;
+			var r = (this.s < 0) ? n - 1 : 0;
+			if (this.t > 0) {
+				if (d == 0) {
+					r = this[0] % n;
+				} else {
+					for (var i = this.t - 1; i >= 0; --i) {
+						r = (d * r + this[i]) % n;
+					}
+				}
+			}
+			return r;
+		};
+		// BigInteger.prototype.millerRabin = bnpMillerRabin;
+		// (protected) true if probably prime (HAC 4.24, Miller-Rabin)
+		BigInteger.prototype.millerRabin = function(t) {
+			var n1 = this.subtract(BigInteger.ONE);
+			var k = n1.getLowestSetBit();
+			if (k <= 0) {
+				return false;
+			}
+			var r = n1.shiftRight(k);
+			t = (t + 1) >> 1;
+			if (t > lowprimes.length) {
+				t = lowprimes.length;
+			}
+			var a = nbi();
+			for (var i = 0; i < t; ++i) {
+				// Pick bases at random, instead of starting at 2
+				a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
+				var y = a.modPow(r, this);
+				if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
+					var j = 1;
+					while (j++ < k && y.compareTo(n1) != 0) {
+						y = y.modPowInt(2, this);
+						if (y.compareTo(BigInteger.ONE) == 0) {
+							return false;
+						}
+					}
+					if (y.compareTo(n1) != 0) {
+						return false;
+					}
+				}
+			}
+			return true;
+		};
+		// BigInteger.prototype.square = bnSquare;
+		// (public) this^2
+		BigInteger.prototype.square = function() {
+			var r = nbi();
+			this.squareTo(r);
+			return r;
+		};
+		//#region ASYNC
+		// Public API method
+		BigInteger.prototype.gcda = function(a, callback) {
+			var x = (this.s < 0) ? this.negate() : this.clone();
+			var y = (a.s < 0) ? a.negate() : a.clone();
+			if (x.compareTo(y) < 0) {
+				var t = x;
+				x = y;
+				y = t;
+			}
+			var i = x.getLowestSetBit();
+			var g = y.getLowestSetBit();
+			if (g < 0) {
+				callback(x);
+				return;
+			}
+			if (i < g) {
+				g = i;
+			}
+			if (g > 0) {
+				x.rShiftTo(g, x);
+				y.rShiftTo(g, y);
+			}
+			// Workhorse of the algorithm, gets called 200 - 800 times per 512 bit keygen.
+			var gcda1 = function() {
+				if ((i = x.getLowestSetBit()) > 0) {
+					x.rShiftTo(i, x);
+				}
+				if ((i = y.getLowestSetBit()) > 0) {
+					y.rShiftTo(i, y);
+				}
+				if (x.compareTo(y) >= 0) {
+					x.subTo(y, x);
+					x.rShiftTo(1, x);
+				} else {
+					y.subTo(x, y);
+					y.rShiftTo(1, y);
+				}
+				if (!(x.signum() > 0)) {
+					if (g > 0) {
+						y.lShiftTo(g, y);
+					}
+					setTimeout(function() {
+						callback(y);
+					}, 0); // escape
+				} else {
+					setTimeout(gcda1, 0);
+				}
+			};
+			setTimeout(gcda1, 10);
+		};
+		// (protected) alternate constructor
+		BigInteger.prototype.fromNumberAsync = function(a, b, c, callback) {
+			if ("number" == typeof b) {
+				if (a < 2) {
+					this.fromInt(1);
+				} else {
+					this.fromNumber(a, c);
+					if (!this.testBit(a - 1)) {
+						this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
+					}
+					if (this.isEven()) {
+						this.dAddOffset(1, 0);
+					}
+					var bnp_1 = this;
+					var bnpfn1_1 = function() {
+						bnp_1.dAddOffset(2, 0);
+						if (bnp_1.bitLength() > a) {
+							bnp_1.subTo(BigInteger.ONE.shiftLeft(a - 1), bnp_1);
+						}
+						if (bnp_1.isProbablePrime(b)) {
+							setTimeout(function() {
+								callback();
+							}, 0); // escape
+						} else {
+							setTimeout(bnpfn1_1, 0);
+						}
+					};
+					setTimeout(bnpfn1_1, 0);
+				}
+			} else {
+				var x = [];
+				var t = a & 7;
+				x.length = (a >> 3) + 1;
+				b.nextBytes(x);
+				if (t > 0) {
+					x[0] &= ((1 << t) - 1);
+				} else {
+					x[0] = 0;
+				}
+				this.fromString(x, 256);
+			}
+		};
+		return BigInteger;
+	}());
+	//#region REDUCERS
+	//#region NullExp
+	var NullExp = /** @class */ (function() {
+		function NullExp() {}
+		// NullExp.prototype.convert = nNop;
+		NullExp.prototype.convert = function(x) {
+			return x;
+		};
+		// NullExp.prototype.revert = nNop;
+		NullExp.prototype.revert = function(x) {
+			return x;
+		};
+		// NullExp.prototype.mulTo = nMulTo;
+		NullExp.prototype.mulTo = function(x, y, r) {
+			x.multiplyTo(y, r);
+		};
+		// NullExp.prototype.sqrTo = nSqrTo;
+		NullExp.prototype.sqrTo = function(x, r) {
+			x.squareTo(r);
+		};
+		return NullExp;
+	}());
+	// Modular reduction using "classic" algorithm
+	var Classic = /** @class */ (function() {
+		function Classic(m) {
+			this.m = m;
+		}
+		// Classic.prototype.convert = cConvert;
+		Classic.prototype.convert = function(x) {
+			if (x.s < 0 || x.compareTo(this.m) >= 0) {
+				return x.mod(this.m);
+			} else {
+				return x;
+			}
+		};
+		// Classic.prototype.revert = cRevert;
+		Classic.prototype.revert = function(x) {
+			return x;
+		};
+		// Classic.prototype.reduce = cReduce;
+		Classic.prototype.reduce = function(x) {
+			x.divRemTo(this.m, null, x);
+		};
+		// Classic.prototype.mulTo = cMulTo;
+		Classic.prototype.mulTo = function(x, y, r) {
+			x.multiplyTo(y, r);
+			this.reduce(r);
+		};
+		// Classic.prototype.sqrTo = cSqrTo;
+		Classic.prototype.sqrTo = function(x, r) {
+			x.squareTo(r);
+			this.reduce(r);
+		};
+		return Classic;
+	}());
+	//#endregion
+	//#region Montgomery
+	// Montgomery reduction
+	var Montgomery = /** @class */ (function() {
+		function Montgomery(m) {
+			this.m = m;
+			this.mp = m.invDigit();
+			this.mpl = this.mp & 0x7fff;
+			this.mph = this.mp >> 15;
+			this.um = (1 << (m.DB - 15)) - 1;
+			this.mt2 = 2 * m.t;
+		}
+		// Montgomery.prototype.convert = montConvert;
+		// xR mod m
+		Montgomery.prototype.convert = function(x) {
+			var r = nbi();
+			x.abs().dlShiftTo(this.m.t, r);
+			r.divRemTo(this.m, null, r);
+			if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {
+				this.m.subTo(r, r);
+			}
+			return r;
+		};
+		// Montgomery.prototype.revert = montRevert;
+		// x/R mod m
+		Montgomery.prototype.revert = function(x) {
+			var r = nbi();
+			x.copyTo(r);
+			this.reduce(r);
+			return r;
+		};
+		// Montgomery.prototype.reduce = montReduce;
+		// x = x/R mod m (HAC 14.32)
+		Montgomery.prototype.reduce = function(x) {
+			while (x.t <= this.mt2) {
+				// pad x so am has enough room later
+				x[x.t++] = 0;
+			}
+			for (var i = 0; i < this.m.t; ++i) {
+				// faster way of calculating u0 = x[i]*mp mod DV
+				var j = x[i] & 0x7fff;
+				var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this
+					.um) << 15)) & x.DM;
+				// use am to combine the multiply-shift-add into one call
+				j = i + this.m.t;
+				x[j] += this.m.am(0, u0, x, i, 0, this.m.t);
+				// propagate carry
+				while (x[j] >= x.DV) {
+					x[j] -= x.DV;
+					x[++j]++;
+				}
+			}
+			x.clamp();
+			x.drShiftTo(this.m.t, x);
+			if (x.compareTo(this.m) >= 0) {
+				x.subTo(this.m, x);
+			}
+		};
+		// Montgomery.prototype.mulTo = montMulTo;
+		// r = "xy/R mod m"; x,y != r
+		Montgomery.prototype.mulTo = function(x, y, r) {
+			x.multiplyTo(y, r);
+			this.reduce(r);
+		};
+		// Montgomery.prototype.sqrTo = montSqrTo;
+		// r = "x^2/R mod m"; x != r
+		Montgomery.prototype.sqrTo = function(x, r) {
+			x.squareTo(r);
+			this.reduce(r);
+		};
+		return Montgomery;
+	}());
+	//#endregion Montgomery
+	//#region Barrett
+	// Barrett modular reduction
+	var Barrett = /** @class */ (function() {
+		function Barrett(m) {
+			this.m = m;
+			// setup Barrett
+			this.r2 = nbi();
+			this.q3 = nbi();
+			BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);
+			this.mu = this.r2.divide(m);
+		}
+		// Barrett.prototype.convert = barrettConvert;
+		Barrett.prototype.convert = function(x) {
+			if (x.s < 0 || x.t > 2 * this.m.t) {
+				return x.mod(this.m);
+			} else if (x.compareTo(this.m) < 0) {
+				return x;
+			} else {
+				var r = nbi();
+				x.copyTo(r);
+				this.reduce(r);
+				return r;
+			}
+		};
+		// Barrett.prototype.revert = barrettRevert;
+		Barrett.prototype.revert = function(x) {
+			return x;
+		};
+		// Barrett.prototype.reduce = barrettReduce;
+		// x = x mod m (HAC 14.42)
+		Barrett.prototype.reduce = function(x) {
+			x.drShiftTo(this.m.t - 1, this.r2);
+			if (x.t > this.m.t + 1) {
+				x.t = this.m.t + 1;
+				x.clamp();
+			}
+			this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
+			this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
+			while (x.compareTo(this.r2) < 0) {
+				x.dAddOffset(1, this.m.t + 1);
+			}
+			x.subTo(this.r2, x);
+			while (x.compareTo(this.m) >= 0) {
+				x.subTo(this.m, x);
+			}
+		};
+		// Barrett.prototype.mulTo = barrettMulTo;
+		// r = x*y mod m; x,y != r
+		Barrett.prototype.mulTo = function(x, y, r) {
+			x.multiplyTo(y, r);
+			this.reduce(r);
+		};
+		// Barrett.prototype.sqrTo = barrettSqrTo;
+		// r = x^2 mod m; x != r
+		Barrett.prototype.sqrTo = function(x, r) {
+			x.squareTo(r);
+			this.reduce(r);
+		};
+		return Barrett;
+	}());
+	//#endregion
+	//#endregion REDUCERS
+	// return new, unset BigInteger
+	function nbi() {
+		return new BigInteger(null);
+	}
+
+	function parseBigInt(str, r) {
+		return new BigInteger(str, r);
+	}
+	// am: Compute w_j += (x*this_i), propagate carries,
+	// c is initial carry, returns final carry.
+	// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
+	// We need to select the fastest one that works in this environment.
+	// am1: use a single mult and divide to get the high bits,
+	// max digit bits should be 26 because
+	// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
+	function am1(i, x, w, j, c, n) {
+		while (--n >= 0) {
+			var v = x * this[i++] + w[j] + c;
+			c = Math.floor(v / 0x4000000);
+			w[j++] = v & 0x3ffffff;
+		}
+		return c;
+	}
+	// am2 avoids a big mult-and-extract completely.
+	// Max digit bits should be <= 30 because we do bitwise ops
+	// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
+	function am2(i, x, w, j, c, n) {
+		var xl = x & 0x7fff;
+		var xh = x >> 15;
+		while (--n >= 0) {
+			var l = this[i] & 0x7fff;
+			var h = this[i++] >> 15;
+			var m = xh * l + h * xl;
+			l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);
+			c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);
+			w[j++] = l & 0x3fffffff;
+		}
+		return c;
+	}
+	// Alternately, set max digit bits to 28 since some
+	// browsers slow down when dealing with 32-bit numbers.
+	function am3(i, x, w, j, c, n) {
+		var xl = x & 0x3fff;
+		var xh = x >> 14;
+		while (--n >= 0) {
+			var l = this[i] & 0x3fff;
+			var h = this[i++] >> 14;
+			var m = xh * l + h * xl;
+			l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;
+			c = (l >> 28) + (m >> 14) + xh * h;
+			w[j++] = l & 0xfffffff;
+		}
+		return c;
+	}
+	var inBrowser = typeof navigator2 !== "undefined";
+	if (inBrowser && j_lm && (navigator2.appName == "Microsoft Internet Explorer")) {
+		BigInteger.prototype.am = am2;
+		dbits = 30;
+	} else if (inBrowser && j_lm && (navigator2.appName != "Netscape")) {
+		BigInteger.prototype.am = am1;
+		dbits = 26;
+	} else { // Mozilla/Netscape seems to prefer am3
+		BigInteger.prototype.am = am3;
+		dbits = 28;
+	}
+	BigInteger.prototype.DB = dbits;
+	BigInteger.prototype.DM = ((1 << dbits) - 1);
+	BigInteger.prototype.DV = (1 << dbits);
+	var BI_FP = 52;
+	BigInteger.prototype.FV = Math.pow(2, BI_FP);
+	BigInteger.prototype.F1 = BI_FP - dbits;
+	BigInteger.prototype.F2 = 2 * dbits - BI_FP;
+	// Digit conversions
+	var BI_RC = [];
+	var rr;
+	var vv;
+	rr = "0".charCodeAt(0);
+	for (vv = 0; vv <= 9; ++vv) {
+		BI_RC[rr++] = vv;
+	}
+	rr = "a".charCodeAt(0);
+	for (vv = 10; vv < 36; ++vv) {
+		BI_RC[rr++] = vv;
+	}
+	rr = "A".charCodeAt(0);
+	for (vv = 10; vv < 36; ++vv) {
+		BI_RC[rr++] = vv;
+	}
+
+	function intAt(s, i) {
+		var c = BI_RC[s.charCodeAt(i)];
+		return (c == null) ? -1 : c;
+	}
+	// return bigint initialized to value
+	function nbv(i) {
+		var r = nbi();
+		r.fromInt(i);
+		return r;
+	}
+	// returns bit length of the integer x
+	function nbits(x) {
+		var r = 1;
+		var t;
+		if ((t = x >>> 16) != 0) {
+			x = t;
+			r += 16;
+		}
+		if ((t = x >> 8) != 0) {
+			x = t;
+			r += 8;
+		}
+		if ((t = x >> 4) != 0) {
+			x = t;
+			r += 4;
+		}
+		if ((t = x >> 2) != 0) {
+			x = t;
+			r += 2;
+		}
+		if ((t = x >> 1) != 0) {
+			x = t;
+			r += 1;
+		}
+		return r;
+	}
+	// "constants"
+	BigInteger.ZERO = nbv(0);
+	BigInteger.ONE = nbv(1);
+
+	// prng4.js - uses Arcfour as a PRNG
+	var Arcfour = /** @class */ (function() {
+		function Arcfour() {
+			this.i = 0;
+			this.j = 0;
+			this.S = [];
+		}
+		// Arcfour.prototype.init = ARC4init;
+		// Initialize arcfour context from key, an array of ints, each from [0..255]
+		Arcfour.prototype.init = function(key) {
+			var i;
+			var j;
+			var t;
+			for (i = 0; i < 256; ++i) {
+				this.S[i] = i;
+			}
+			j = 0;
+			for (i = 0; i < 256; ++i) {
+				j = (j + this.S[i] + key[i % key.length]) & 255;
+				t = this.S[i];
+				this.S[i] = this.S[j];
+				this.S[j] = t;
+			}
+			this.i = 0;
+			this.j = 0;
+		};
+		// Arcfour.prototype.next = ARC4next;
+		Arcfour.prototype.next = function() {
+			var t;
+			this.i = (this.i + 1) & 255;
+			this.j = (this.j + this.S[this.i]) & 255;
+			t = this.S[this.i];
+			this.S[this.i] = this.S[this.j];
+			this.S[this.j] = t;
+			return this.S[(t + this.S[this.i]) & 255];
+		};
+		return Arcfour;
+	}());
+	// Plug in your RNG constructor here
+	function prng_newstate() {
+		return new Arcfour();
+	}
+	// Pool size must be a multiple of 4 and greater than 32.
+	// An array of bytes the size of the pool will be passed to init()
+	var rng_psize = 256;
+
+	// Random number generator - requires a PRNG backend, e.g. prng4.js
+	var rng_state;
+	var rng_pool = null;
+	var rng_pptr;
+	// Initialize the pool with junk if needed.
+	if (rng_pool == null) {
+		rng_pool = [];
+		rng_pptr = 0;
+		var t = void 0;
+		if (window2.crypto && window2.crypto.getRandomValues) {
+			// Extract entropy (2048 bits) from RNG if available
+			var z = new Uint32Array(256);
+			window2.crypto.getRandomValues(z);
+			for (t = 0; t < z.length; ++t) {
+				rng_pool[rng_pptr++] = z[t] & 255;
+			}
+		}
+		// Use mouse events for entropy, if we do not have enough entropy by the time
+		// we need it, entropy will be generated by Math.random.
+		var onMouseMoveListener_1 = function(ev) {
+			this.count = this.count || 0;
+			if (this.count >= 256 || rng_pptr >= rng_psize) {
+				if (window2.removeEventListener) {
+					window2.removeEventListener("mousemove", onMouseMoveListener_1, false);
+				} else if (window2.detachEvent) {
+					window2.detachEvent("onmousemove", onMouseMoveListener_1);
+				}
+				return;
+			}
+			try {
+				var mouseCoordinates = ev.x + ev.y;
+				rng_pool[rng_pptr++] = mouseCoordinates & 255;
+				this.count += 1;
+			} catch (e) {
+				// Sometimes Firefox will deny permission to access event properties for some reason. Ignore.
+			}
+		};
+		if (window2.addEventListener) {
+			window2.addEventListener("mousemove", onMouseMoveListener_1, false);
+		} else if (window2.attachEvent) {
+			window2.attachEvent("onmousemove", onMouseMoveListener_1);
+		}
+	}
+
+	function rng_get_byte() {
+		if (rng_state == null) {
+			rng_state = prng_newstate();
+			// At this point, we may not have collected enough entropy.  If not, fall back to Math.random
+			while (rng_pptr < rng_psize) {
+				var random = Math.floor(65536 * Math.random());
+				rng_pool[rng_pptr++] = random & 255;
+			}
+			rng_state.init(rng_pool);
+			for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
+				rng_pool[rng_pptr] = 0;
+			}
+			rng_pptr = 0;
+		}
+		// TODO: allow reseeding after first request
+		return rng_state.next();
+	}
+	var SecureRandom = /** @class */ (function() {
+		function SecureRandom() {}
+		SecureRandom.prototype.nextBytes = function(ba) {
+			for (var i = 0; i < ba.length; ++i) {
+				ba[i] = rng_get_byte();
+			}
+		};
+		return SecureRandom;
+	}());
+
+	// Depends on jsbn.js and rng.js
+	// function linebrk(s,n) {
+	//   var ret = "";
+	//   var i = 0;
+	//   while(i + n < s.length) {
+	//     ret += s.substring(i,i+n) + "\n";
+	//     i += n;
+	//   }
+	//   return ret + s.substring(i,s.length);
+	// }
+	// function byte2Hex(b) {
+	//   if(b < 0x10)
+	//     return "0" + b.toString(16);
+	//   else
+	//     return b.toString(16);
+	// }
+	function pkcs1pad1(s, n) {
+		if (n < s.length + 22) {
+			console.error("Message too long for RSA");
+			return null;
+		}
+		var len = n - s.length - 6;
+		var filler = "";
+		for (var f = 0; f < len; f += 2) {
+			filler += "ff";
+		}
+		var m = "0001" + filler + "00" + s;
+		return parseBigInt(m, 16);
+	}
+	// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
+	function pkcs1pad2(s, n) {
+		if (n < s.length + 11) { // TODO: fix for utf-8
+			console.error("Message too long for RSA");
+			return null;
+		}
+		var ba = [];
+		var i = s.length - 1;
+		while (i >= 0 && n > 0) {
+			var c = s.charCodeAt(i--);
+			if (c < 128) { // encode using utf-8
+				ba[--n] = c;
+			} else if ((c > 127) && (c < 2048)) {
+				ba[--n] = (c & 63) | 128;
+				ba[--n] = (c >> 6) | 192;
+			} else {
+				ba[--n] = (c & 63) | 128;
+				ba[--n] = ((c >> 6) & 63) | 128;
+				ba[--n] = (c >> 12) | 224;
+			}
+		}
+		ba[--n] = 0;
+		var rng = new SecureRandom();
+		var x = [];
+		while (n > 2) { // random non-zero pad
+			x[0] = 0;
+			while (x[0] == 0) {
+				rng.nextBytes(x);
+			}
+			ba[--n] = x[0];
+		}
+		ba[--n] = 2;
+		ba[--n] = 0;
+		return new BigInteger(ba);
+	}
+	// "empty" RSA key constructor
+	var RSAKey = /** @class */ (function() {
+		function RSAKey() {
+			this.n = null;
+			this.e = 0;
+			this.d = null;
+			this.p = null;
+			this.q = null;
+			this.dmp1 = null;
+			this.dmq1 = null;
+			this.coeff = null;
+		}
+		//#region PROTECTED
+		// protected
+		// RSAKey.prototype.doPublic = RSADoPublic;
+		// Perform raw public operation on "x": return x^e (mod n)
+		RSAKey.prototype.doPublic = function(x) {
+			return x.modPowInt(this.e, this.n);
+		};
+		// RSAKey.prototype.doPrivate = RSADoPrivate;
+		// Perform raw private operation on "x": return x^d (mod n)
+		RSAKey.prototype.doPrivate = function(x) {
+			console.log('p',this.p,'q',this.q)
+			console.log('d',this.d,'n',this.n)
+			if (this.p == null || this.q == null) {
+				
+				return x.modPow(this.d, this.n);
+				
+			}
+			// TODO: re-calculate any missing CRT params
+			var xp = x.mod(this.p).modPow(this.dmp1, this.p);
+			var xq = x.mod(this.q).modPow(this.dmq1, this.q);
+			while (xp.compareTo(xq) < 0) {
+				xp = xp.add(this.p);
+			}
+			return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);
+		};
+		//#endregion PROTECTED
+		//#region PUBLIC
+		// RSAKey.prototype.setPublic = RSASetPublic;
+		// Set the public key fields N and e from hex strings
+		RSAKey.prototype.setPublic = function(N, E) {
+			if (N != null && E != null && N.length > 0 && E.length > 0) {
+				this.n = parseBigInt(N, 16);
+				this.e = parseInt(E, 16);
+			} else {
+				console.error("Invalid RSA public key");
+			}
+		};
+		// RSAKey.prototype.encrypt = RSAEncrypt;
+		// Return the PKCS#1 RSA encryption of "text" as an even-length hex string
+		RSAKey.prototype.encrypt = function(text) {
+			var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3);
+			if (m == null) {
+				return null;
+			}
+			var c = this.doPublic(m);
+			if (c == null) {
+				return null;
+			}
+			var h = c.toString(16);
+			if ((h.length & 1) == 0) {
+				return h;
+			} else {
+				return "0" + h;
+			}
+		};
+		// RSAKey.prototype.setPrivate = RSASetPrivate;
+		// Set the private key fields N, e, and d from hex strings
+		RSAKey.prototype.setPrivate = function(N, E, D) {
+			if (N != null && E != null && N.length > 0 && E.length > 0) {
+				this.n = parseBigInt(N, 16);
+				this.e = parseInt(E, 16);
+				this.d = parseBigInt(D, 16);
+			} else {
+				console.error("Invalid RSA private key");
+			}
+		};
+		// RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
+		// Set the private key fields N, e, d and CRT params from hex strings
+		RSAKey.prototype.setPrivateEx = function(N, E, D, P, Q, DP, DQ, C) {
+			if (N != null && E != null && N.length > 0 && E.length > 0) {
+				this.n = parseBigInt(N, 16);
+				this.e = parseInt(E, 16);
+				this.d = parseBigInt(D, 16);
+				this.p = parseBigInt(P, 16);
+				this.q = parseBigInt(Q, 16);
+				this.dmp1 = parseBigInt(DP, 16);
+				this.dmq1 = parseBigInt(DQ, 16);
+				this.coeff = parseBigInt(C, 16);
+			} else {
+				console.error("Invalid RSA private key");
+			}
+		};
+		// RSAKey.prototype.generate = RSAGenerate;
+		// Generate a new random private key B bits long, using public expt E
+		RSAKey.prototype.generate = function(B, E) {
+			var rng = new SecureRandom();
+			var qs = B >> 1;
+			this.e = parseInt(E, 16);
+			var ee = new BigInteger(E, 16);
+			for (;;) {
+				for (;;) {
+					this.p = new BigInteger(B - qs, 1, rng);
+					if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) ==
+						0 && this.p.isProbablePrime(10)) {
+						break;
+					}
+				}
+				for (;;) {
+					this.q = new BigInteger(qs, 1, rng);
+					if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) ==
+						0 && this.q.isProbablePrime(10)) {
+						break;
+					}
+				}
+				if (this.p.compareTo(this.q) <= 0) {
+					var t = this.p;
+					this.p = this.q;
+					this.q = t;
+				}
+				var p1 = this.p.subtract(BigInteger.ONE);
+				var q1 = this.q.subtract(BigInteger.ONE);
+				var phi = p1.multiply(q1);
+				if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
+					this.n = this.p.multiply(this.q);
+					this.d = ee.modInverse(phi);
+					this.dmp1 = this.d.mod(p1);
+					this.dmq1 = this.d.mod(q1);
+					this.coeff = this.q.modInverse(this.p);
+					break;
+				}
+			}
+		};
+		// RSAKey.prototype.decrypt = RSADecrypt;
+		// Return the PKCS#1 RSA decryption of "ctext".
+		// "ctext" is an even-length hex string and the output is a plain string.
+		RSAKey.prototype.decrypt = function(ctext) {
+			var c = parseBigInt(ctext, 16);
+			var m = this.doPrivate(c);
+			if (m == null) {
+				return null;
+			}
+			return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3);
+		};
+		// Generate a new random private key B bits long, using public expt E
+		RSAKey.prototype.generateAsync = function(B, E, callback) {
+			var rng = new SecureRandom();
+			var qs = B >> 1;
+			this.e = parseInt(E, 16);
+			var ee = new BigInteger(E, 16);
+			var rsa = this;
+			// These functions have non-descript names because they were originally for(;;) loops.
+			// I don't know about cryptography to give them better names than loop1-4.
+			var loop1 = function() {
+				var loop4 = function() {
+					if (rsa.p.compareTo(rsa.q) <= 0) {
+						var t = rsa.p;
+						rsa.p = rsa.q;
+						rsa.q = t;
+					}
+					var p1 = rsa.p.subtract(BigInteger.ONE);
+					var q1 = rsa.q.subtract(BigInteger.ONE);
+					var phi = p1.multiply(q1);
+					if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
+						rsa.n = rsa.p.multiply(rsa.q);
+						rsa.d = ee.modInverse(phi);
+						rsa.dmp1 = rsa.d.mod(p1);
+						rsa.dmq1 = rsa.d.mod(q1);
+						rsa.coeff = rsa.q.modInverse(rsa.p);
+						setTimeout(function() {
+							callback();
+						}, 0); // escape
+					} else {
+						setTimeout(loop1, 0);
+					}
+				};
+				var loop3 = function() {
+					rsa.q = nbi();
+					rsa.q.fromNumberAsync(qs, 1, rng, function() {
+						rsa.q.subtract(BigInteger.ONE).gcda(ee, function(r) {
+							if (r.compareTo(BigInteger.ONE) == 0 && rsa
+								.q.isProbablePrime(10)) {
+								setTimeout(loop4, 0);
+							} else {
+								setTimeout(loop3, 0);
+							}
+						});
+					});
+				};
+				var loop2 = function() {
+					rsa.p = nbi();
+					rsa.p.fromNumberAsync(B - qs, 1, rng, function() {
+						rsa.p.subtract(BigInteger.ONE).gcda(ee, function(r) {
+							if (r.compareTo(BigInteger.ONE) == 0 && rsa
+								.p.isProbablePrime(10)) {
+								setTimeout(loop3, 0);
+							} else {
+								setTimeout(loop2, 0);
+							}
+						});
+					});
+				};
+				setTimeout(loop2, 0);
+			};
+			setTimeout(loop1, 0);
+		};
+		RSAKey.prototype.sign = function(text, digestMethod, digestName) {
+			console.log(digestMethod)
+			var header = getDigestHeader(digestName);
+			var digest = header + digestMethod(text).toString();
+			var m = pkcs1pad1(digest, this.n.bitLength() / 4);
+			if (m == null) {
+				return null;
+			}
+			console.log("m",m.toString())
+			var c = this.doPrivate(m);
+			if (c == null) {
+				return null;
+			}
+			var h = c.toString(16);
+			if ((h.length & 1) == 0) {
+				return h;
+			} else {
+				return "0" + h;
+			}
+		};
+		RSAKey.prototype.verify = function(text, signature, digestMethod) {
+			var c = parseBigInt(signature, 16);
+			var m = this.doPublic(c);
+			if (m == null) {
+				return null;
+			}
+			var unpadded = m.toString(16).replace(/^1f+00/, "");
+			var digest = removeDigestHeader(unpadded);
+			return digest == digestMethod(text).toString();
+		};
+		return RSAKey;
+	}());
+	// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext
+	function pkcs1unpad2(d, n) {
+		var b = d.toByteArray();
+		var i = 0;
+		while (i < b.length && b[i] == 0) {
+			++i;
+		}
+		if (b.length - i != n - 1 || b[i] != 2) {
+			return null;
+		}
+		++i;
+		while (b[i] != 0) {
+			if (++i >= b.length) {
+				return null;
+			}
+		}
+		var ret = "";
+		while (++i < b.length) {
+			var c = b[i] & 255;
+			if (c < 128) { // utf-8 decode
+				ret += String.fromCharCode(c);
+			} else if ((c > 191) && (c < 224)) {
+				ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63));
+				++i;
+			} else {
+				ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63));
+				i += 2;
+			}
+		}
+		return ret;
+	}
+	// https://tools.ietf.org/html/rfc3447#page-43
+	var DIGEST_HEADERS = {
+		md2: "3020300c06082a864886f70d020205000410",
+		md5: "3020300c06082a864886f70d020505000410",
+		sha1: "3021300906052b0e03021a05000414",
+		sha224: "302d300d06096086480165030402040500041c",
+		sha256: "3031300d060960864801650304020105000420",
+		sha384: "3041300d060960864801650304020205000430",
+		sha512: "3051300d060960864801650304020305000440",
+		ripemd160: "3021300906052b2403020105000414",
+	};
+
+	function getDigestHeader(name) {
+		return DIGEST_HEADERS[name] || "";
+	}
+
+	function removeDigestHeader(str) {
+		for (var name_1 in DIGEST_HEADERS) {
+			if (DIGEST_HEADERS.hasOwnProperty(name_1)) {
+				var header = DIGEST_HEADERS[name_1];
+				var len = header.length;
+				if (str.substr(0, len) == header) {
+					return str.substr(len);
+				}
+			}
+		}
+		return str;
+	}
+	// Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string
+	// function RSAEncryptB64(text) {
+	//  var h = this.encrypt(text);
+	//  if(h) return hex2b64(h); else return null;
+	// }
+	// public
+	// RSAKey.prototype.encrypt_b64 = RSAEncryptB64;
+
+	/*!
+	Copyright (c) 2011, Yahoo! Inc. All rights reserved.
+	Code licensed under the BSD License:
+	http://developer.yahoo.com/yui/license.html
+	version: 2.9.0
+	*/
+	var YAHOO = {};
+	YAHOO.lang = {
+		/**
+		 * Utility to set up the prototype, constructor and superclass properties to
+		 * support an inheritance strategy that can chain constructors and methods.
+		 * Static members will not be inherited.
+		 *
+		 * @method extend
+		 * @static
+		 * @param {Function} subc   the object to modify
+		 * @param {Function} superc the object to inherit
+		 * @param {Object} overrides  additional properties/methods to add to the
+		 *                              subclass prototype.  These will override the
+		 *                              matching items obtained from the superclass
+		 *                              if present.
+		 */
+		extend: function(subc, superc, overrides) {
+			if (!superc || !subc) {
+				throw new Error("YAHOO.lang.extend failed, please check that " +
+					"all dependencies are included.");
+			}
+
+			var F = function() {};
+			F.prototype = superc.prototype;
+			subc.prototype = new F();
+			subc.prototype.constructor = subc;
+			subc.superclass = superc.prototype;
+
+			if (superc.prototype.constructor == Object.prototype.constructor) {
+				superc.prototype.constructor = superc;
+			}
+
+			if (overrides) {
+				var i;
+				for (i in overrides) {
+					subc.prototype[i] = overrides[i];
+				}
+
+				/*
+				 * IE will not enumerate native functions in a derived object even if the
+				 * function was overridden.  This is a workaround for specific functions
+				 * we care about on the Object prototype.
+				 * @property _IEEnumFix
+				 * @param {Function} r  the object to receive the augmentation
+				 * @param {Function} s  the object that supplies the properties to augment
+				 * @static
+				 * @private
+				 */
+				var _IEEnumFix = function() {},
+					ADD = ["toString", "valueOf"];
+				try {
+					if (/MSIE/.test(navigator2.userAgent)) {
+						_IEEnumFix = function(r, s) {
+							for (i = 0; i < ADD.length; i = i + 1) {
+								var fname = ADD[i],
+									f = s[fname];
+								if (typeof f === 'function' && f != Object.prototype[fname]) {
+									r[fname] = f;
+								}
+							}
+						};
+					}
+				} catch (ex) {}
+				_IEEnumFix(subc.prototype, overrides);
+			}
+		}
+	};
+
+	/* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
+	 */
+
+	/**
+	 * @fileOverview
+	 * @name asn1-1.0.js
+	 * @author Kenji Urushima kenji.urushima@gmail.com
+	 * @version asn1 1.0.13 (2017-Jun-02)
+	 * @since jsrsasign 2.1
+	 * @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
+	 */
+
+	/**
+	 * kjur's class library name space
+	 * <p>
+	 * This name space provides following name spaces:
+	 * <ul>
+	 * <li>{@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder</li>
+	 * <li>{@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL</li>
+	 * <li>{@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature
+	 * class and utilities</li>
+	 * </ul>
+	 * </p>
+	 * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2.
+	 * @name KJUR
+	 * @namespace kjur's class library name space
+	 */
+	var KJUR = {};
+
+	/**
+	 * kjur's ASN.1 class library name space
+	 * <p>
+	 * This is ITU-T X.690 ASN.1 DER encoder class library and
+	 * class structure and methods is very similar to
+	 * org.bouncycastle.asn1 package of
+	 * well known BouncyCaslte Cryptography Library.
+	 * <h4>PROVIDING ASN.1 PRIMITIVES</h4>
+	 * Here are ASN.1 DER primitive classes.
+	 * <ul>
+	 * <li>0x01 {@link KJUR.asn1.DERBoolean}</li>
+	 * <li>0x02 {@link KJUR.asn1.DERInteger}</li>
+	 * <li>0x03 {@link KJUR.asn1.DERBitString}</li>
+	 * <li>0x04 {@link KJUR.asn1.DEROctetString}</li>
+	 * <li>0x05 {@link KJUR.asn1.DERNull}</li>
+	 * <li>0x06 {@link KJUR.asn1.DERObjectIdentifier}</li>
+	 * <li>0x0a {@link KJUR.asn1.DEREnumerated}</li>
+	 * <li>0x0c {@link KJUR.asn1.DERUTF8String}</li>
+	 * <li>0x12 {@link KJUR.asn1.DERNumericString}</li>
+	 * <li>0x13 {@link KJUR.asn1.DERPrintableString}</li>
+	 * <li>0x14 {@link KJUR.asn1.DERTeletexString}</li>
+	 * <li>0x16 {@link KJUR.asn1.DERIA5String}</li>
+	 * <li>0x17 {@link KJUR.asn1.DERUTCTime}</li>
+	 * <li>0x18 {@link KJUR.asn1.DERGeneralizedTime}</li>
+	 * <li>0x30 {@link KJUR.asn1.DERSequence}</li>
+	 * <li>0x31 {@link KJUR.asn1.DERSet}</li>
+	 * </ul>
+	 * <h4>OTHER ASN.1 CLASSES</h4>
+	 * <ul>
+	 * <li>{@link KJUR.asn1.ASN1Object}</li>
+	 * <li>{@link KJUR.asn1.DERAbstractString}</li>
+	 * <li>{@link KJUR.asn1.DERAbstractTime}</li>
+	 * <li>{@link KJUR.asn1.DERAbstractStructured}</li>
+	 * <li>{@link KJUR.asn1.DERTaggedObject}</li>
+	 * </ul>
+	 * <h4>SUB NAME SPACES</h4>
+	 * <ul>
+	 * <li>{@link KJUR.asn1.cades} - CAdES long term signature format</li>
+	 * <li>{@link KJUR.asn1.cms} - Cryptographic Message Syntax</li>
+	 * <li>{@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)</li>
+	 * <li>{@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format</li>
+	 * <li>{@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL</li>
+	 * </ul>
+	 * </p>
+	 * NOTE: Please ignore method summary and document of this namespace.
+	 * This caused by a bug of jsdoc2.
+	 * @name KJUR.asn1
+	 * @namespace
+	 */
+	if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) KJUR.asn1 = {};
+
+	/**
+	 * ASN1 utilities class
+	 * @name KJUR.asn1.ASN1Util
+	 * @class ASN1 utilities class
+	 * @since asn1 1.0.2
+	 */
+	KJUR.asn1.ASN1Util = new function() {
+		this.integerToByteHex = function(i) {
+			var h = i.toString(16);
+			if ((h.length % 2) == 1) h = '0' + h;
+			return h;
+		};
+		this.bigIntToMinTwosComplementsHex = function(bigIntegerValue) {
+			var h = bigIntegerValue.toString(16);
+			if (h.substr(0, 1) != '-') {
+				if (h.length % 2 == 1) {
+					h = '0' + h;
+				} else {
+					if (!h.match(/^[0-7]/)) {
+						h = '00' + h;
+					}
+				}
+			} else {
+				var hPos = h.substr(1);
+				var xorLen = hPos.length;
+				if (xorLen % 2 == 1) {
+					xorLen += 1;
+				} else {
+					if (!h.match(/^[0-7]/)) {
+						xorLen += 2;
+					}
+				}
+				var hMask = '';
+				for (var i = 0; i < xorLen; i++) {
+					hMask += 'f';
+				}
+				var biMask = new BigInteger(hMask, 16);
+				var biNeg = biMask.xor(bigIntegerValue).add(BigInteger.ONE);
+				h = biNeg.toString(16).replace(/^-/, '');
+			}
+			return h;
+		};
+		/**
+		 * get PEM string from hexadecimal data and header string
+		 * @name getPEMStringFromHex
+		 * @memberOf KJUR.asn1.ASN1Util
+		 * @function
+		 * @param {String} dataHex hexadecimal string of PEM body
+		 * @param {String} pemHeader PEM header string (ex. 'RSA PRIVATE KEY')
+		 * @return {String} PEM formatted string of input data
+		 * @description
+		 * This method converts a hexadecimal string to a PEM string with
+		 * a specified header. Its line break will be CRLF("\r\n").
+		 * @example
+		 * var pem  = KJUR.asn1.ASN1Util.getPEMStringFromHex('616161', 'RSA PRIVATE KEY');
+		 * // value of pem will be:
+		 * -----BEGIN PRIVATE KEY-----
+		 * YWFh
+		 * -----END PRIVATE KEY-----
+		 */
+		this.getPEMStringFromHex = function(dataHex, pemHeader) {
+			return hextopem(dataHex, pemHeader);
+		};
+
+		/**
+		 * generate ASN1Object specifed by JSON parameters
+		 * @name newObject
+		 * @memberOf KJUR.asn1.ASN1Util
+		 * @function
+		 * @param {Array} param JSON parameter to generate ASN1Object
+		 * @return {KJUR.asn1.ASN1Object} generated object
+		 * @since asn1 1.0.3
+		 * @description
+		 * generate any ASN1Object specified by JSON param
+		 * including ASN.1 primitive or structured.
+		 * Generally 'param' can be described as follows:
+		 * <blockquote>
+		 * {TYPE-OF-ASNOBJ: ASN1OBJ-PARAMETER}
+		 * </blockquote>
+		 * 'TYPE-OF-ASN1OBJ' can be one of following symbols:
+		 * <ul>
+		 * <li>'bool' - DERBoolean</li>
+		 * <li>'int' - DERInteger</li>
+		 * <li>'bitstr' - DERBitString</li>
+		 * <li>'octstr' - DEROctetString</li>
+		 * <li>'null' - DERNull</li>
+		 * <li>'oid' - DERObjectIdentifier</li>
+		 * <li>'enum' - DEREnumerated</li>
+		 * <li>'utf8str' - DERUTF8String</li>
+		 * <li>'numstr' - DERNumericString</li>
+		 * <li>'prnstr' - DERPrintableString</li>
+		 * <li>'telstr' - DERTeletexString</li>
+		 * <li>'ia5str' - DERIA5String</li>
+		 * <li>'utctime' - DERUTCTime</li>
+		 * <li>'gentime' - DERGeneralizedTime</li>
+		 * <li>'seq' - DERSequence</li>
+		 * <li>'set' - DERSet</li>
+		 * <li>'tag' - DERTaggedObject</li>
+		 * </ul>
+		 * @example
+		 * newObject({'prnstr': 'aaa'});
+		 * newObject({'seq': [{'int': 3}, {'prnstr': 'aaa'}]})
+		 * // ASN.1 Tagged Object
+		 * newObject({'tag': {'tag': 'a1',
+		 *                    'explicit': true,
+		 *                    'obj': {'seq': [{'int': 3}, {'prnstr': 'aaa'}]}}});
+		 * // more simple representation of ASN.1 Tagged Object
+		 * newObject({'tag': ['a1',
+		 *                    true,
+		 *                    {'seq': [
+		 *                      {'int': 3},
+		 *                      {'prnstr': 'aaa'}]}
+		 *                   ]});
+		 */
+		this.newObject = function(param) {
+			var _KJUR = KJUR,
+				_KJUR_asn1 = _KJUR.asn1,
+				_DERBoolean = _KJUR_asn1.DERBoolean,
+				_DERInteger = _KJUR_asn1.DERInteger,
+				_DERBitString = _KJUR_asn1.DERBitString,
+				_DEROctetString = _KJUR_asn1.DEROctetString,
+				_DERNull = _KJUR_asn1.DERNull,
+				_DERObjectIdentifier = _KJUR_asn1.DERObjectIdentifier,
+				_DEREnumerated = _KJUR_asn1.DEREnumerated,
+				_DERUTF8String = _KJUR_asn1.DERUTF8String,
+				_DERNumericString = _KJUR_asn1.DERNumericString,
+				_DERPrintableString = _KJUR_asn1.DERPrintableString,
+				_DERTeletexString = _KJUR_asn1.DERTeletexString,
+				_DERIA5String = _KJUR_asn1.DERIA5String,
+				_DERUTCTime = _KJUR_asn1.DERUTCTime,
+				_DERGeneralizedTime = _KJUR_asn1.DERGeneralizedTime,
+				_DERSequence = _KJUR_asn1.DERSequence,
+				_DERSet = _KJUR_asn1.DERSet,
+				_DERTaggedObject = _KJUR_asn1.DERTaggedObject,
+				_newObject = _KJUR_asn1.ASN1Util.newObject;
+
+			var keys = Object.keys(param);
+			if (keys.length != 1)
+				throw "key of param shall be only one.";
+			var key = keys[0];
+
+			if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:"
+				.indexOf(":" + key + ":") == -1)
+				throw "undefined key: " + key;
+
+			if (key == "bool") return new _DERBoolean(param[key]);
+			if (key == "int") return new _DERInteger(param[key]);
+			if (key == "bitstr") return new _DERBitString(param[key]);
+			if (key == "octstr") return new _DEROctetString(param[key]);
+			if (key == "null") return new _DERNull(param[key]);
+			if (key == "oid") return new _DERObjectIdentifier(param[key]);
+			if (key == "enum") return new _DEREnumerated(param[key]);
+			if (key == "utf8str") return new _DERUTF8String(param[key]);
+			if (key == "numstr") return new _DERNumericString(param[key]);
+			if (key == "prnstr") return new _DERPrintableString(param[key]);
+			if (key == "telstr") return new _DERTeletexString(param[key]);
+			if (key == "ia5str") return new _DERIA5String(param[key]);
+			if (key == "utctime") return new _DERUTCTime(param[key]);
+			if (key == "gentime") return new _DERGeneralizedTime(param[key]);
+
+			if (key == "seq") {
+				var paramList = param[key];
+				var a = [];
+				for (var i = 0; i < paramList.length; i++) {
+					var asn1Obj = _newObject(paramList[i]);
+					a.push(asn1Obj);
+				}
+				return new _DERSequence({
+					'array': a
+				});
+			}
+
+			if (key == "set") {
+				var paramList = param[key];
+				var a = [];
+				for (var i = 0; i < paramList.length; i++) {
+					var asn1Obj = _newObject(paramList[i]);
+					a.push(asn1Obj);
+				}
+				return new _DERSet({
+					'array': a
+				});
+			}
+
+			if (key == "tag") {
+				var tagParam = param[key];
+				if (Object.prototype.toString.call(tagParam) === '[object Array]' &&
+					tagParam.length == 3) {
+					var obj = _newObject(tagParam[2]);
+					return new _DERTaggedObject({
+						tag: tagParam[0],
+						explicit: tagParam[1],
+						obj: obj
+					});
+				} else {
+					var newParam = {};
+					if (tagParam.explicit !== undefined)
+						newParam.explicit = tagParam.explicit;
+					if (tagParam.tag !== undefined)
+						newParam.tag = tagParam.tag;
+					if (tagParam.obj === undefined)
+						throw "obj shall be specified for 'tag'.";
+					newParam.obj = _newObject(tagParam.obj);
+					return new _DERTaggedObject(newParam);
+				}
+			}
+		};
+
+		/**
+		 * get encoded hexadecimal string of ASN1Object specifed by JSON parameters
+		 * @name jsonToASN1HEX
+		 * @memberOf KJUR.asn1.ASN1Util
+		 * @function
+		 * @param {Array} param JSON parameter to generate ASN1Object
+		 * @return hexadecimal string of ASN1Object
+		 * @since asn1 1.0.4
+		 * @description
+		 * As for ASN.1 object representation of JSON object,
+		 * please see {@link newObject}.
+		 * @example
+		 * jsonToASN1HEX({'prnstr': 'aaa'});
+		 */
+		this.jsonToASN1HEX = function(param) {
+			var asn1Obj = this.newObject(param);
+			return asn1Obj.getEncodedHex();
+		};
+	};
+
+	/**
+	 * get dot noted oid number string from hexadecimal value of OID
+	 * @name oidHexToInt
+	 * @memberOf KJUR.asn1.ASN1Util
+	 * @function
+	 * @param {String} hex hexadecimal value of object identifier
+	 * @return {String} dot noted string of object identifier
+	 * @since jsrsasign 4.8.3 asn1 1.0.7
+	 * @description
+	 * This static method converts from hexadecimal string representation of
+	 * ASN.1 value of object identifier to oid number string.
+	 * @example
+	 * KJUR.asn1.ASN1Util.oidHexToInt('550406') &rarr; "2.5.4.6"
+	 */
+	KJUR.asn1.ASN1Util.oidHexToInt = function(hex) {
+		var s = "";
+		var i01 = parseInt(hex.substr(0, 2), 16);
+		var i0 = Math.floor(i01 / 40);
+		var i1 = i01 % 40;
+		var s = i0 + "." + i1;
+
+		var binbuf = "";
+		for (var i = 2; i < hex.length; i += 2) {
+			var value = parseInt(hex.substr(i, 2), 16);
+			var bin = ("00000000" + value.toString(2)).slice(-8);
+			binbuf = binbuf + bin.substr(1, 7);
+			if (bin.substr(0, 1) == "0") {
+				var bi = new BigInteger(binbuf, 2);
+				s = s + "." + bi.toString(10);
+				binbuf = "";
+			}
+		}
+		return s;
+	};
+
+	/**
+	 * get hexadecimal value of object identifier from dot noted oid value
+	 * @name oidIntToHex
+	 * @memberOf KJUR.asn1.ASN1Util
+	 * @function
+	 * @param {String} oidString dot noted string of object identifier
+	 * @return {String} hexadecimal value of object identifier
+	 * @since jsrsasign 4.8.3 asn1 1.0.7
+	 * @description
+	 * This static method converts from object identifier value string.
+	 * to hexadecimal string representation of it.
+	 * @example
+	 * KJUR.asn1.ASN1Util.oidIntToHex("2.5.4.6") &rarr; "550406"
+	 */
+	KJUR.asn1.ASN1Util.oidIntToHex = function(oidString) {
+		var itox = function(i) {
+			var h = i.toString(16);
+			if (h.length == 1) h = '0' + h;
+			return h;
+		};
+
+		var roidtox = function(roid) {
+			var h = '';
+			var bi = new BigInteger(roid, 10);
+			var b = bi.toString(2);
+			var padLen = 7 - b.length % 7;
+			if (padLen == 7) padLen = 0;
+			var bPad = '';
+			for (var i = 0; i < padLen; i++) bPad += '0';
+			b = bPad + b;
+			for (var i = 0; i < b.length - 1; i += 7) {
+				var b8 = b.substr(i, 7);
+				if (i != b.length - 7) b8 = '1' + b8;
+				h += itox(parseInt(b8, 2));
+			}
+			return h;
+		};
+
+		if (!oidString.match(/^[0-9.]+$/)) {
+			throw "malformed oid string: " + oidString;
+		}
+		var h = '';
+		var a = oidString.split('.');
+		var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);
+		h += itox(i0);
+		a.splice(0, 2);
+		for (var i = 0; i < a.length; i++) {
+			h += roidtox(a[i]);
+		}
+		return h;
+	};
+
+
+	// ********************************************************************
+	//  Abstract ASN.1 Classes
+	// ********************************************************************
+
+	// ********************************************************************
+
+	/**
+	 * base class for ASN.1 DER encoder object
+	 * @name KJUR.asn1.ASN1Object
+	 * @class base class for ASN.1 DER encoder object
+	 * @property {Boolean} isModified flag whether internal data was changed
+	 * @property {String} hTLV hexadecimal string of ASN.1 TLV
+	 * @property {String} hT hexadecimal string of ASN.1 TLV tag(T)
+	 * @property {String} hL hexadecimal string of ASN.1 TLV length(L)
+	 * @property {String} hV hexadecimal string of ASN.1 TLV value(V)
+	 * @description
+	 */
+	KJUR.asn1.ASN1Object = function() {
+		var hV = '';
+
+		/**
+		 * get hexadecimal ASN.1 TLV length(L) bytes from TLV value(V)
+		 * @name getLengthHexFromValue
+		 * @memberOf KJUR.asn1.ASN1Object#
+		 * @function
+		 * @return {String} hexadecimal string of ASN.1 TLV length(L)
+		 */
+		this.getLengthHexFromValue = function() {
+			if (typeof this.hV == "undefined" || this.hV == null) {
+				throw "this.hV is null or undefined.";
+			}
+			if (this.hV.length % 2 == 1) {
+				throw "value hex must be even length: n=" + hV.length + ",v=" + this.hV;
+			}
+			var n = this.hV.length / 2;
+			var hN = n.toString(16);
+			if (hN.length % 2 == 1) {
+				hN = "0" + hN;
+			}
+			if (n < 128) {
+				return hN;
+			} else {
+				var hNlen = hN.length / 2;
+				if (hNlen > 15) {
+					throw "ASN.1 length too long to represent by 8x: n = " + n.toString(16);
+				}
+				var head = 128 + hNlen;
+				return head.toString(16) + hN;
+			}
+		};
+
+		/**
+		 * get hexadecimal string of ASN.1 TLV bytes
+		 * @name getEncodedHex
+		 * @memberOf KJUR.asn1.ASN1Object#
+		 * @function
+		 * @return {String} hexadecimal string of ASN.1 TLV
+		 */
+		this.getEncodedHex = function() {
+			if (this.hTLV == null || this.isModified) {
+				this.hV = this.getFreshValueHex();
+				this.hL = this.getLengthHexFromValue();
+				this.hTLV = this.hT + this.hL + this.hV;
+				this.isModified = false;
+				//alert("first time: " + this.hTLV);
+			}
+			return this.hTLV;
+		};
+
+		/**
+		 * get hexadecimal string of ASN.1 TLV value(V) bytes
+		 * @name getValueHex
+		 * @memberOf KJUR.asn1.ASN1Object#
+		 * @function
+		 * @return {String} hexadecimal string of ASN.1 TLV value(V) bytes
+		 */
+		this.getValueHex = function() {
+			this.getEncodedHex();
+			return this.hV;
+		};
+
+		this.getFreshValueHex = function() {
+			return '';
+		};
+	};
+
+	// == BEGIN DERAbstractString ================================================
+	/**
+	 * base class for ASN.1 DER string classes
+	 * @name KJUR.asn1.DERAbstractString
+	 * @class base class for ASN.1 DER string classes
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @property {String} s internal string of value
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>str - specify initial ASN.1 value(V) by a string</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 */
+	KJUR.asn1.DERAbstractString = function(params) {
+		KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
+
+		/**
+		 * get string value of this string object
+		 * @name getString
+		 * @memberOf KJUR.asn1.DERAbstractString#
+		 * @function
+		 * @return {String} string value of this string object
+		 */
+		this.getString = function() {
+			return this.s;
+		};
+
+		/**
+		 * set value by a string
+		 * @name setString
+		 * @memberOf KJUR.asn1.DERAbstractString#
+		 * @function
+		 * @param {String} newS value by a string to set
+		 */
+		this.setString = function(newS) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = newS;
+			this.hV = stohex(this.s);
+		};
+
+		/**
+		 * set value by a hexadecimal string
+		 * @name setStringHex
+		 * @memberOf KJUR.asn1.DERAbstractString#
+		 * @function
+		 * @param {String} newHexString value by a hexadecimal string to set
+		 */
+		this.setStringHex = function(newHexString) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = null;
+			this.hV = newHexString;
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params == "string") {
+				this.setString(params);
+			} else if (typeof params['str'] != "undefined") {
+				this.setString(params['str']);
+			} else if (typeof params['hex'] != "undefined") {
+				this.setStringHex(params['hex']);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);
+	// == END   DERAbstractString ================================================
+
+	// == BEGIN DERAbstractTime ==================================================
+	/**
+	 * base class for ASN.1 DER Generalized/UTCTime class
+	 * @name KJUR.asn1.DERAbstractTime
+	 * @class base class for ASN.1 DER Generalized/UTCTime class
+	 * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * @see KJUR.asn1.ASN1Object - superclass
+	 */
+	KJUR.asn1.DERAbstractTime = function(params) {
+		KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);
+
+		// --- PRIVATE METHODS --------------------
+		this.localDateToUTC = function(d) {
+			utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+			var utcDate = new Date(utc);
+			return utcDate;
+		};
+
+		/*
+		 * format date string by Data object
+		 * @name formatDate
+		 * @memberOf KJUR.asn1.AbstractTime;
+		 * @param {Date} dateObject
+		 * @param {string} type 'utc' or 'gen'
+		 * @param {boolean} withMillis flag for with millisections or not
+		 * @description
+		 * 'withMillis' flag is supported from asn1 1.0.6.
+		 */
+		this.formatDate = function(dateObject, type, withMillis) {
+			var pad = this.zeroPadding;
+			var d = this.localDateToUTC(dateObject);
+			var year = String(d.getFullYear());
+			if (type == 'utc') year = year.substr(2, 2);
+			var month = pad(String(d.getMonth() + 1), 2);
+			var day = pad(String(d.getDate()), 2);
+			var hour = pad(String(d.getHours()), 2);
+			var min = pad(String(d.getMinutes()), 2);
+			var sec = pad(String(d.getSeconds()), 2);
+			var s = year + month + day + hour + min + sec;
+			if (withMillis === true) {
+				var millis = d.getMilliseconds();
+				if (millis != 0) {
+					var sMillis = pad(String(millis), 3);
+					sMillis = sMillis.replace(/[0]+$/, "");
+					s = s + "." + sMillis;
+				}
+			}
+			return s + "Z";
+		};
+
+		this.zeroPadding = function(s, len) {
+			if (s.length >= len) return s;
+			return new Array(len - s.length + 1).join('0') + s;
+		};
+
+		// --- PUBLIC METHODS --------------------
+		/**
+		 * get string value of this string object
+		 * @name getString
+		 * @memberOf KJUR.asn1.DERAbstractTime#
+		 * @function
+		 * @return {String} string value of this time object
+		 */
+		this.getString = function() {
+			return this.s;
+		};
+
+		/**
+		 * set value by a string
+		 * @name setString
+		 * @memberOf KJUR.asn1.DERAbstractTime#
+		 * @function
+		 * @param {String} newS value by a string to set such like "130430235959Z"
+		 */
+		this.setString = function(newS) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = newS;
+			this.hV = stohex(newS);
+		};
+
+		/**
+		 * set value by a Date object
+		 * @name setByDateValue
+		 * @memberOf KJUR.asn1.DERAbstractTime#
+		 * @function
+		 * @param {Integer} year year of date (ex. 2013)
+		 * @param {Integer} month month of date between 1 and 12 (ex. 12)
+		 * @param {Integer} day day of month
+		 * @param {Integer} hour hours of date
+		 * @param {Integer} min minutes of date
+		 * @param {Integer} sec seconds of date
+		 */
+		this.setByDateValue = function(year, month, day, hour, min, sec) {
+			var dateObject = new Date(Date.UTC(year, month - 1, day, hour, min, sec, 0));
+			this.setByDate(dateObject);
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);
+	// == END   DERAbstractTime ==================================================
+
+	// == BEGIN DERAbstractStructured ============================================
+	/**
+	 * base class for ASN.1 DER structured class
+	 * @name KJUR.asn1.DERAbstractStructured
+	 * @class base class for ASN.1 DER structured class
+	 * @property {Array} asn1Array internal array of ASN1Object
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * @see KJUR.asn1.ASN1Object - superclass
+	 */
+	KJUR.asn1.DERAbstractStructured = function(params) {
+		KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
+
+		/**
+		 * set value by array of ASN1Object
+		 * @name setByASN1ObjectArray
+		 * @memberOf KJUR.asn1.DERAbstractStructured#
+		 * @function
+		 * @param {array} asn1ObjectArray array of ASN1Object to set
+		 */
+		this.setByASN1ObjectArray = function(asn1ObjectArray) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.asn1Array = asn1ObjectArray;
+		};
+
+		/**
+		 * append an ASN1Object to internal array
+		 * @name appendASN1Object
+		 * @memberOf KJUR.asn1.DERAbstractStructured#
+		 * @function
+		 * @param {ASN1Object} asn1Object to add
+		 */
+		this.appendASN1Object = function(asn1Object) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.asn1Array.push(asn1Object);
+		};
+
+		this.asn1Array = new Array();
+		if (typeof params != "undefined") {
+			if (typeof params['array'] != "undefined") {
+				this.asn1Array = params['array'];
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);
+
+
+	// ********************************************************************
+	//  ASN.1 Object Classes
+	// ********************************************************************
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Boolean
+	 * @name KJUR.asn1.DERBoolean
+	 * @class class for ASN.1 DER Boolean
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * @see KJUR.asn1.ASN1Object - superclass
+	 */
+	KJUR.asn1.DERBoolean = function() {
+		KJUR.asn1.DERBoolean.superclass.constructor.call(this);
+		this.hT = "01";
+		this.hTLV = "0101ff";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Integer
+	 * @name KJUR.asn1.DERInteger
+	 * @class class for ASN.1 DER Integer
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>int - specify initial ASN.1 value(V) by integer value</li>
+	 * <li>bigint - specify initial ASN.1 value(V) by BigInteger object</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 */
+	KJUR.asn1.DERInteger = function(params) {
+		KJUR.asn1.DERInteger.superclass.constructor.call(this);
+		this.hT = "02";
+
+		/**
+		 * set value by Tom Wu's BigInteger object
+		 * @name setByBigInteger
+		 * @memberOf KJUR.asn1.DERInteger#
+		 * @function
+		 * @param {BigInteger} bigIntegerValue to set
+		 */
+		this.setByBigInteger = function(bigIntegerValue) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);
+		};
+
+		/**
+		 * set value by integer value
+		 * @name setByInteger
+		 * @memberOf KJUR.asn1.DERInteger
+		 * @function
+		 * @param {Integer} integer value to set
+		 */
+		this.setByInteger = function(intValue) {
+			var bi = new BigInteger(String(intValue), 10);
+			this.setByBigInteger(bi);
+		};
+
+		/**
+		 * set value by integer value
+		 * @name setValueHex
+		 * @memberOf KJUR.asn1.DERInteger#
+		 * @function
+		 * @param {String} hexadecimal string of integer value
+		 * @description
+		 * <br/>
+		 * NOTE: Value shall be represented by minimum octet length of
+		 * two's complement representation.
+		 * @example
+		 * new KJUR.asn1.DERInteger(123);
+		 * new KJUR.asn1.DERInteger({'int': 123});
+		 * new KJUR.asn1.DERInteger({'hex': '1fad'});
+		 */
+		this.setValueHex = function(newHexString) {
+			this.hV = newHexString;
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params['bigint'] != "undefined") {
+				this.setByBigInteger(params['bigint']);
+			} else if (typeof params['int'] != "undefined") {
+				this.setByInteger(params['int']);
+			} else if (typeof params == "number") {
+				this.setByInteger(params);
+			} else if (typeof params['hex'] != "undefined") {
+				this.setValueHex(params['hex']);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER encoded BitString primitive
+	 * @name KJUR.asn1.DERBitString
+	 * @class class for ASN.1 DER encoded BitString primitive
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>bin - specify binary string (ex. '10111')</li>
+	 * <li>array - specify array of boolean (ex. [true,false,true,true])</li>
+	 * <li>hex - specify hexadecimal string of ASN.1 value(V) including unused bits</li>
+	 * <li>obj - specify {@link KJUR.asn1.ASN1Util.newObject}
+	 * argument for "BitString encapsulates" structure.</li>
+	 * </ul>
+	 * NOTE1: 'params' can be omitted.<br/>
+	 * NOTE2: 'obj' parameter have been supported since
+	 * asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).<br/>
+	 * @example
+	 * // default constructor
+	 * o = new KJUR.asn1.DERBitString();
+	 * // initialize with binary string
+	 * o = new KJUR.asn1.DERBitString({bin: "1011"});
+	 * // initialize with boolean array
+	 * o = new KJUR.asn1.DERBitString({array: [true,false,true,true]});
+	 * // initialize with hexadecimal string (04 is unused bits)
+	 * o = new KJUR.asn1.DEROctetString({hex: "04bac0"});
+	 * // initialize with ASN1Util.newObject argument for encapsulated
+	 * o = new KJUR.asn1.DERBitString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});
+	 * // above generates a ASN.1 data like this:
+	 * // BIT STRING, encapsulates {
+	 * //   SEQUENCE {
+	 * //     INTEGER 3
+	 * //     PrintableString 'aaa'
+	 * //     }
+	 * //   }
+	 */
+	KJUR.asn1.DERBitString = function(params) {
+		if (params !== undefined && typeof params.obj !== "undefined") {
+			var o = KJUR.asn1.ASN1Util.newObject(params.obj);
+			params.hex = "00" + o.getEncodedHex();
+		}
+		KJUR.asn1.DERBitString.superclass.constructor.call(this);
+		this.hT = "03";
+
+		/**
+		 * set ASN.1 value(V) by a hexadecimal string including unused bits
+		 * @name setHexValueIncludingUnusedBits
+		 * @memberOf KJUR.asn1.DERBitString#
+		 * @function
+		 * @param {String} newHexStringIncludingUnusedBits
+		 */
+		this.setHexValueIncludingUnusedBits = function(newHexStringIncludingUnusedBits) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = newHexStringIncludingUnusedBits;
+		};
+
+		/**
+		 * set ASN.1 value(V) by unused bit and hexadecimal string of value
+		 * @name setUnusedBitsAndHexValue
+		 * @memberOf KJUR.asn1.DERBitString#
+		 * @function
+		 * @param {Integer} unusedBits
+		 * @param {String} hValue
+		 */
+		this.setUnusedBitsAndHexValue = function(unusedBits, hValue) {
+			if (unusedBits < 0 || 7 < unusedBits) {
+				throw "unused bits shall be from 0 to 7: u = " + unusedBits;
+			}
+			var hUnusedBits = "0" + unusedBits;
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = hUnusedBits + hValue;
+		};
+
+		/**
+		 * set ASN.1 DER BitString by binary string<br/>
+		 * @name setByBinaryString
+		 * @memberOf KJUR.asn1.DERBitString#
+		 * @function
+		 * @param {String} binaryString binary value string (i.e. '10111')
+		 * @description
+		 * Its unused bits will be calculated automatically by length of
+		 * 'binaryValue'. <br/>
+		 * NOTE: Trailing zeros '0' will be ignored.
+		 * @example
+		 * o = new KJUR.asn1.DERBitString();
+		 * o.setByBooleanArray("01011");
+		 */
+		this.setByBinaryString = function(binaryString) {
+			binaryString = binaryString.replace(/0+$/, '');
+			var unusedBits = 8 - binaryString.length % 8;
+			if (unusedBits == 8) unusedBits = 0;
+			for (var i = 0; i <= unusedBits; i++) {
+				binaryString += '0';
+			}
+			var h = '';
+			for (var i = 0; i < binaryString.length - 1; i += 8) {
+				var b = binaryString.substr(i, 8);
+				var x = parseInt(b, 2).toString(16);
+				if (x.length == 1) x = '0' + x;
+				h += x;
+			}
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = '0' + unusedBits + h;
+		};
+
+		/**
+		 * set ASN.1 TLV value(V) by an array of boolean<br/>
+		 * @name setByBooleanArray
+		 * @memberOf KJUR.asn1.DERBitString#
+		 * @function
+		 * @param {array} booleanArray array of boolean (ex. [true, false, true])
+		 * @description
+		 * NOTE: Trailing falses will be ignored in the ASN.1 DER Object.
+		 * @example
+		 * o = new KJUR.asn1.DERBitString();
+		 * o.setByBooleanArray([false, true, false, true, true]);
+		 */
+		this.setByBooleanArray = function(booleanArray) {
+			var s = '';
+			for (var i = 0; i < booleanArray.length; i++) {
+				if (booleanArray[i] == true) {
+					s += '1';
+				} else {
+					s += '0';
+				}
+			}
+			this.setByBinaryString(s);
+		};
+
+		/**
+		 * generate an array of falses with specified length<br/>
+		 * @name newFalseArray
+		 * @memberOf KJUR.asn1.DERBitString
+		 * @function
+		 * @param {Integer} nLength length of array to generate
+		 * @return {array} array of boolean falses
+		 * @description
+		 * This static method may be useful to initialize boolean array.
+		 * @example
+		 * o = new KJUR.asn1.DERBitString();
+		 * o.newFalseArray(3) &rarr; [false, false, false]
+		 */
+		this.newFalseArray = function(nLength) {
+			var a = new Array(nLength);
+			for (var i = 0; i < nLength; i++) {
+				a[i] = false;
+			}
+			return a;
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params == "string" && params.toLowerCase().match(/^[0-9a-f]+$/)) {
+				this.setHexValueIncludingUnusedBits(params);
+			} else if (typeof params['hex'] != "undefined") {
+				this.setHexValueIncludingUnusedBits(params['hex']);
+			} else if (typeof params['bin'] != "undefined") {
+				this.setByBinaryString(params['bin']);
+			} else if (typeof params['array'] != "undefined") {
+				this.setByBooleanArray(params['array']);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER OctetString<br/>
+	 * @name KJUR.asn1.DEROctetString
+	 * @class class for ASN.1 DER OctetString
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * This class provides ASN.1 OctetString simple type.<br/>
+	 * Supported "params" attributes are:
+	 * <ul>
+	 * <li>str - to set a string as a value</li>
+	 * <li>hex - to set a hexadecimal string as a value</li>
+	 * <li>obj - to set a encapsulated ASN.1 value by JSON object
+	 * which is defined in {@link KJUR.asn1.ASN1Util.newObject}</li>
+	 * </ul>
+	 * NOTE: A parameter 'obj' have been supported
+	 * for "OCTET STRING, encapsulates" structure.
+	 * since asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 * @example
+	 * // default constructor
+	 * o = new KJUR.asn1.DEROctetString();
+	 * // initialize with string
+	 * o = new KJUR.asn1.DEROctetString({str: "aaa"});
+	 * // initialize with hexadecimal string
+	 * o = new KJUR.asn1.DEROctetString({hex: "616161"});
+	 * // initialize with ASN1Util.newObject argument
+	 * o = new KJUR.asn1.DEROctetString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});
+	 * // above generates a ASN.1 data like this:
+	 * // OCTET STRING, encapsulates {
+	 * //   SEQUENCE {
+	 * //     INTEGER 3
+	 * //     PrintableString 'aaa'
+	 * //     }
+	 * //   }
+	 */
+	KJUR.asn1.DEROctetString = function(params) {
+		if (params !== undefined && typeof params.obj !== "undefined") {
+			var o = KJUR.asn1.ASN1Util.newObject(params.obj);
+			params.hex = o.getEncodedHex();
+		}
+		KJUR.asn1.DEROctetString.superclass.constructor.call(this, params);
+		this.hT = "04";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Null
+	 * @name KJUR.asn1.DERNull
+	 * @class class for ASN.1 DER Null
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * @see KJUR.asn1.ASN1Object - superclass
+	 */
+	KJUR.asn1.DERNull = function() {
+		KJUR.asn1.DERNull.superclass.constructor.call(this);
+		this.hT = "05";
+		this.hTLV = "0500";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER ObjectIdentifier
+	 * @name KJUR.asn1.DERObjectIdentifier
+	 * @class class for ASN.1 DER ObjectIdentifier
+	 * @param {Array} params associative array of parameters (ex. {'oid': '2.5.4.5'})
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>oid - specify initial ASN.1 value(V) by a oid string (ex. 2.5.4.13)</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 */
+	KJUR.asn1.DERObjectIdentifier = function(params) {
+		var itox = function(i) {
+			var h = i.toString(16);
+			if (h.length == 1) h = '0' + h;
+			return h;
+		};
+		var roidtox = function(roid) {
+			var h = '';
+			var bi = new BigInteger(roid, 10);
+			var b = bi.toString(2);
+			var padLen = 7 - b.length % 7;
+			if (padLen == 7) padLen = 0;
+			var bPad = '';
+			for (var i = 0; i < padLen; i++) bPad += '0';
+			b = bPad + b;
+			for (var i = 0; i < b.length - 1; i += 7) {
+				var b8 = b.substr(i, 7);
+				if (i != b.length - 7) b8 = '1' + b8;
+				h += itox(parseInt(b8, 2));
+			}
+			return h;
+		};
+
+		KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
+		this.hT = "06";
+
+		/**
+		 * set value by a hexadecimal string
+		 * @name setValueHex
+		 * @memberOf KJUR.asn1.DERObjectIdentifier#
+		 * @function
+		 * @param {String} newHexString hexadecimal value of OID bytes
+		 */
+		this.setValueHex = function(newHexString) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = null;
+			this.hV = newHexString;
+		};
+
+		/**
+		 * set value by a OID string<br/>
+		 * @name setValueOidString
+		 * @memberOf KJUR.asn1.DERObjectIdentifier#
+		 * @function
+		 * @param {String} oidString OID string (ex. 2.5.4.13)
+		 * @example
+		 * o = new KJUR.asn1.DERObjectIdentifier();
+		 * o.setValueOidString("2.5.4.13");
+		 */
+		this.setValueOidString = function(oidString) {
+			if (!oidString.match(/^[0-9.]+$/)) {
+				throw "malformed oid string: " + oidString;
+			}
+			var h = '';
+			var a = oidString.split('.');
+			var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);
+			h += itox(i0);
+			a.splice(0, 2);
+			for (var i = 0; i < a.length; i++) {
+				h += roidtox(a[i]);
+			}
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = null;
+			this.hV = h;
+		};
+
+		/**
+		 * set value by a OID name
+		 * @name setValueName
+		 * @memberOf KJUR.asn1.DERObjectIdentifier#
+		 * @function
+		 * @param {String} oidName OID name (ex. 'serverAuth')
+		 * @since 1.0.1
+		 * @description
+		 * OID name shall be defined in 'KJUR.asn1.x509.OID.name2oidList'.
+		 * Otherwise raise error.
+		 * @example
+		 * o = new KJUR.asn1.DERObjectIdentifier();
+		 * o.setValueName("serverAuth");
+		 */
+		this.setValueName = function(oidName) {
+			var oid = KJUR.asn1.x509.OID.name2oid(oidName);
+			if (oid !== '') {
+				this.setValueOidString(oid);
+			} else {
+				throw "DERObjectIdentifier oidName undefined: " + oidName;
+			}
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (params !== undefined) {
+			if (typeof params === "string") {
+				if (params.match(/^[0-2].[0-9.]+$/)) {
+					this.setValueOidString(params);
+				} else {
+					this.setValueName(params);
+				}
+			} else if (params.oid !== undefined) {
+				this.setValueOidString(params.oid);
+			} else if (params.hex !== undefined) {
+				this.setValueHex(params.hex);
+			} else if (params.name !== undefined) {
+				this.setValueName(params.name);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Enumerated
+	 * @name KJUR.asn1.DEREnumerated
+	 * @class class for ASN.1 DER Enumerated
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>int - specify initial ASN.1 value(V) by integer value</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 * @example
+	 * new KJUR.asn1.DEREnumerated(123);
+	 * new KJUR.asn1.DEREnumerated({int: 123});
+	 * new KJUR.asn1.DEREnumerated({hex: '1fad'});
+	 */
+	KJUR.asn1.DEREnumerated = function(params) {
+		KJUR.asn1.DEREnumerated.superclass.constructor.call(this);
+		this.hT = "0a";
+
+		/**
+		 * set value by Tom Wu's BigInteger object
+		 * @name setByBigInteger
+		 * @memberOf KJUR.asn1.DEREnumerated#
+		 * @function
+		 * @param {BigInteger} bigIntegerValue to set
+		 */
+		this.setByBigInteger = function(bigIntegerValue) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);
+		};
+
+		/**
+		 * set value by integer value
+		 * @name setByInteger
+		 * @memberOf KJUR.asn1.DEREnumerated#
+		 * @function
+		 * @param {Integer} integer value to set
+		 */
+		this.setByInteger = function(intValue) {
+			var bi = new BigInteger(String(intValue), 10);
+			this.setByBigInteger(bi);
+		};
+
+		/**
+		 * set value by integer value
+		 * @name setValueHex
+		 * @memberOf KJUR.asn1.DEREnumerated#
+		 * @function
+		 * @param {String} hexadecimal string of integer value
+		 * @description
+		 * <br/>
+		 * NOTE: Value shall be represented by minimum octet length of
+		 * two's complement representation.
+		 */
+		this.setValueHex = function(newHexString) {
+			this.hV = newHexString;
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params['int'] != "undefined") {
+				this.setByInteger(params['int']);
+			} else if (typeof params == "number") {
+				this.setByInteger(params);
+			} else if (typeof params['hex'] != "undefined") {
+				this.setValueHex(params['hex']);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER UTF8String
+	 * @name KJUR.asn1.DERUTF8String
+	 * @class class for ASN.1 DER UTF8String
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERUTF8String = function(params) {
+		KJUR.asn1.DERUTF8String.superclass.constructor.call(this, params);
+		this.hT = "0c";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER NumericString
+	 * @name KJUR.asn1.DERNumericString
+	 * @class class for ASN.1 DER NumericString
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERNumericString = function(params) {
+		KJUR.asn1.DERNumericString.superclass.constructor.call(this, params);
+		this.hT = "12";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER PrintableString
+	 * @name KJUR.asn1.DERPrintableString
+	 * @class class for ASN.1 DER PrintableString
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERPrintableString = function(params) {
+		KJUR.asn1.DERPrintableString.superclass.constructor.call(this, params);
+		this.hT = "13";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER TeletexString
+	 * @name KJUR.asn1.DERTeletexString
+	 * @class class for ASN.1 DER TeletexString
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERTeletexString = function(params) {
+		KJUR.asn1.DERTeletexString.superclass.constructor.call(this, params);
+		this.hT = "14";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER IA5String
+	 * @name KJUR.asn1.DERIA5String
+	 * @class class for ASN.1 DER IA5String
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERIA5String = function(params) {
+		KJUR.asn1.DERIA5String.superclass.constructor.call(this, params);
+		this.hT = "16";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER UTCTime
+	 * @name KJUR.asn1.DERUTCTime
+	 * @class class for ASN.1 DER UTCTime
+	 * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})
+	 * @extends KJUR.asn1.DERAbstractTime
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>str - specify initial ASN.1 value(V) by a string (ex.'130430235959Z')</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * <li>date - specify Date object.</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 * <h4>EXAMPLES</h4>
+	 * @example
+	 * d1 = new KJUR.asn1.DERUTCTime();
+	 * d1.setString('130430125959Z');
+	 *
+	 * d2 = new KJUR.asn1.DERUTCTime({'str': '130430125959Z'});
+	 * d3 = new KJUR.asn1.DERUTCTime({'date': new Date(Date.UTC(2015, 0, 31, 0, 0, 0, 0))});
+	 * d4 = new KJUR.asn1.DERUTCTime('130430125959Z');
+	 */
+	KJUR.asn1.DERUTCTime = function(params) {
+		KJUR.asn1.DERUTCTime.superclass.constructor.call(this, params);
+		this.hT = "17";
+
+		/**
+		 * set value by a Date object<br/>
+		 * @name setByDate
+		 * @memberOf KJUR.asn1.DERUTCTime#
+		 * @function
+		 * @param {Date} dateObject Date object to set ASN.1 value(V)
+		 * @example
+		 * o = new KJUR.asn1.DERUTCTime();
+		 * o.setByDate(new Date("2016/12/31"));
+		 */
+		this.setByDate = function(dateObject) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.date = dateObject;
+			this.s = this.formatDate(this.date, 'utc');
+			this.hV = stohex(this.s);
+		};
+
+		this.getFreshValueHex = function() {
+			if (typeof this.date == "undefined" && typeof this.s == "undefined") {
+				this.date = new Date();
+				this.s = this.formatDate(this.date, 'utc');
+				this.hV = stohex(this.s);
+			}
+			return this.hV;
+		};
+
+		if (params !== undefined) {
+			if (params.str !== undefined) {
+				this.setString(params.str);
+			} else if (typeof params == "string" && params.match(/^[0-9]{12}Z$/)) {
+				this.setString(params);
+			} else if (params.hex !== undefined) {
+				this.setStringHex(params.hex);
+			} else if (params.date !== undefined) {
+				this.setByDate(params.date);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER GeneralizedTime
+	 * @name KJUR.asn1.DERGeneralizedTime
+	 * @class class for ASN.1 DER GeneralizedTime
+	 * @param {Array} params associative array of parameters (ex. {'str': '20130430235959Z'})
+	 * @property {Boolean} withMillis flag to show milliseconds or not
+	 * @extends KJUR.asn1.DERAbstractTime
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>str - specify initial ASN.1 value(V) by a string (ex.'20130430235959Z')</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * <li>date - specify Date object.</li>
+	 * <li>millis - specify flag to show milliseconds (from 1.0.6)</li>
+	 * </ul>
+	 * NOTE1: 'params' can be omitted.
+	 * NOTE2: 'withMillis' property is supported from asn1 1.0.6.
+	 */
+	KJUR.asn1.DERGeneralizedTime = function(params) {
+		KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, params);
+		this.hT = "18";
+		this.withMillis = false;
+
+		/**
+		 * set value by a Date object
+		 * @name setByDate
+		 * @memberOf KJUR.asn1.DERGeneralizedTime#
+		 * @function
+		 * @param {Date} dateObject Date object to set ASN.1 value(V)
+		 * @example
+		 * When you specify UTC time, use 'Date.UTC' method like this:<br/>
+		 * o1 = new DERUTCTime();
+		 * o1.setByDate(date);
+		 *
+		 * date = new Date(Date.UTC(2015, 0, 31, 23, 59, 59, 0)); #2015JAN31 23:59:59
+		 */
+		this.setByDate = function(dateObject) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.date = dateObject;
+			this.s = this.formatDate(this.date, 'gen', this.withMillis);
+			this.hV = stohex(this.s);
+		};
+
+		this.getFreshValueHex = function() {
+			if (this.date === undefined && this.s === undefined) {
+				this.date = new Date();
+				this.s = this.formatDate(this.date, 'gen', this.withMillis);
+				this.hV = stohex(this.s);
+			}
+			return this.hV;
+		};
+
+		if (params !== undefined) {
+			if (params.str !== undefined) {
+				this.setString(params.str);
+			} else if (typeof params == "string" && params.match(/^[0-9]{14}Z$/)) {
+				this.setString(params);
+			} else if (params.hex !== undefined) {
+				this.setStringHex(params.hex);
+			} else if (params.date !== undefined) {
+				this.setByDate(params.date);
+			}
+			if (params.millis === true) {
+				this.withMillis = true;
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Sequence
+	 * @name KJUR.asn1.DERSequence
+	 * @class class for ASN.1 DER Sequence
+	 * @extends KJUR.asn1.DERAbstractStructured
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>array - specify array of ASN1Object to set elements of content</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 */
+	KJUR.asn1.DERSequence = function(params) {
+		KJUR.asn1.DERSequence.superclass.constructor.call(this, params);
+		this.hT = "30";
+		this.getFreshValueHex = function() {
+			var h = '';
+			for (var i = 0; i < this.asn1Array.length; i++) {
+				var asn1Obj = this.asn1Array[i];
+				h += asn1Obj.getEncodedHex();
+			}
+			this.hV = h;
+			return this.hV;
+		};
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Set
+	 * @name KJUR.asn1.DERSet
+	 * @class class for ASN.1 DER Set
+	 * @extends KJUR.asn1.DERAbstractStructured
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>array - specify array of ASN1Object to set elements of content</li>
+	 * <li>sortflag - flag for sort (default: true). ASN.1 BER is not sorted in 'SET OF'.</li>
+	 * </ul>
+	 * NOTE1: 'params' can be omitted.<br/>
+	 * NOTE2: sortflag is supported since 1.0.5.
+	 */
+	KJUR.asn1.DERSet = function(params) {
+		KJUR.asn1.DERSet.superclass.constructor.call(this, params);
+		this.hT = "31";
+		this.sortFlag = true; // item shall be sorted only in ASN.1 DER
+		this.getFreshValueHex = function() {
+			var a = new Array();
+			for (var i = 0; i < this.asn1Array.length; i++) {
+				var asn1Obj = this.asn1Array[i];
+				a.push(asn1Obj.getEncodedHex());
+			}
+			if (this.sortFlag == true) a.sort();
+			this.hV = a.join('');
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params.sortflag != "undefined" &&
+				params.sortflag == false)
+				this.sortFlag = false;
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER TaggedObject
+	 * @name KJUR.asn1.DERTaggedObject
+	 * @class class for ASN.1 DER TaggedObject
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * Parameter 'tagNoNex' is ASN.1 tag(T) value for this object.
+	 * For example, if you find '[1]' tag in a ASN.1 dump,
+	 * 'tagNoHex' will be 'a1'.
+	 * <br/>
+	 * As for optional argument 'params' for constructor, you can specify *ANY* of
+	 * following properties:
+	 * <ul>
+	 * <li>explicit - specify true if this is explicit tag otherwise false
+	 *     (default is 'true').</li>
+	 * <li>tag - specify tag (default is 'a0' which means [0])</li>
+	 * <li>obj - specify ASN1Object which is tagged</li>
+	 * </ul>
+	 * @example
+	 * d1 = new KJUR.asn1.DERUTF8String({'str':'a'});
+	 * d2 = new KJUR.asn1.DERTaggedObject({'obj': d1});
+	 * hex = d2.getEncodedHex();
+	 */
+	KJUR.asn1.DERTaggedObject = function(params) {
+		KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
+		this.hT = "a0";
+		this.hV = '';
+		this.isExplicit = true;
+		this.asn1Object = null;
+
+		/**
+		 * set value by an ASN1Object
+		 * @name setString
+		 * @memberOf KJUR.asn1.DERTaggedObject#
+		 * @function
+		 * @param {Boolean} isExplicitFlag flag for explicit/implicit tag
+		 * @param {Integer} tagNoHex hexadecimal string of ASN.1 tag
+		 * @param {ASN1Object} asn1Object ASN.1 to encapsulate
+		 */
+		this.setASN1Object = function(isExplicitFlag, tagNoHex, asn1Object) {
+			this.hT = tagNoHex;
+			this.isExplicit = isExplicitFlag;
+			this.asn1Object = asn1Object;
+			if (this.isExplicit) {
+				this.hV = this.asn1Object.getEncodedHex();
+				this.hTLV = null;
+				this.isModified = true;
+			} else {
+				this.hV = null;
+				this.hTLV = asn1Object.getEncodedHex();
+				this.hTLV = this.hTLV.replace(/^../, tagNoHex);
+				this.isModified = false;
+			}
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params['tag'] != "undefined") {
+				this.hT = params['tag'];
+			}
+			if (typeof params['explicit'] != "undefined") {
+				this.isExplicit = params['explicit'];
+			}
+			if (typeof params['obj'] != "undefined") {
+				this.asn1Object = params['obj'];
+				this.setASN1Object(this.isExplicit, this.hT, this.asn1Object);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
+
+	/**
+	 * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object.
+	 * This object is just a decorator for parsing the key parameter
+	 * @param {string|Object} key - The key in string format, or an object containing
+	 * the parameters needed to build a RSAKey object.
+	 * @constructor
+	 */
+	var JSEncryptRSAKey = /** @class */ (function(_super) {
+		__extends(JSEncryptRSAKey, _super);
+
+		function JSEncryptRSAKey(key) {
+			var _this = _super.call(this) || this;
+			// Call the super constructor.
+			//  RSAKey.call(this);
+			// If a key key was provided.
+			if (key) {
+				// If this is a string...
+				if (typeof key === "string") {
+					_this.parseKey(key);
+				} else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) ||
+					JSEncryptRSAKey.hasPublicKeyProperty(key)) {
+					// Set the values for the key.
+					_this.parsePropertiesFrom(key);
+				}
+			}
+			return _this;
+		}
+		/**
+		 * Method to parse a pem encoded string containing both a public or private key.
+		 * The method will translate the pem encoded string in a der encoded string and
+		 * will parse private key and public key parameters. This method accepts public key
+		 * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1).
+		 *
+		 * @todo Check how many rsa formats use the same format of pkcs #1.
+		 *
+		 * The format is defined as:
+		 * PublicKeyInfo ::= SEQUENCE {
+		 *   algorithm       AlgorithmIdentifier,
+		 *   PublicKey       BIT STRING
+		 * }
+		 * Where AlgorithmIdentifier is:
+		 * AlgorithmIdentifier ::= SEQUENCE {
+		 *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm
+		 *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)
+		 * }
+		 * and PublicKey is a SEQUENCE encapsulated in a BIT STRING
+		 * RSAPublicKey ::= SEQUENCE {
+		 *   modulus           INTEGER,  -- n
+		 *   publicExponent    INTEGER   -- e
+		 * }
+		 * it's possible to examine the structure of the keys obtained from openssl using
+		 * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/
+		 * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer
+		 * @private
+		 */
+		JSEncryptRSAKey.prototype.parseKey = function(pem) {
+			try {
+				var modulus = 0;
+				var public_exponent = 0;
+				var reHex = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/;
+				var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem);
+				var asn1 = ASN1.decode(der);
+				// Fixes a bug with OpenSSL 1.0+ private keys
+				if (asn1.sub.length === 3) {
+					asn1 = asn1.sub[2].sub[0];
+				}
+				if (asn1.sub.length === 9) {
+					// Parse the private key.
+					modulus = asn1.sub[1].getHexStringValue(); // bigint
+					this.n = parseBigInt(modulus, 16);
+					public_exponent = asn1.sub[2].getHexStringValue(); // int
+					this.e = parseInt(public_exponent, 16);
+					var private_exponent = asn1.sub[3].getHexStringValue(); // bigint
+					this.d = parseBigInt(private_exponent, 16);
+					var prime1 = asn1.sub[4].getHexStringValue(); // bigint
+					this.p = parseBigInt(prime1, 16);
+					var prime2 = asn1.sub[5].getHexStringValue(); // bigint
+					this.q = parseBigInt(prime2, 16);
+					var exponent1 = asn1.sub[6].getHexStringValue(); // bigint
+					this.dmp1 = parseBigInt(exponent1, 16);
+					var exponent2 = asn1.sub[7].getHexStringValue(); // bigint
+					this.dmq1 = parseBigInt(exponent2, 16);
+					var coefficient = asn1.sub[8].getHexStringValue(); // bigint
+					this.coeff = parseBigInt(coefficient, 16);
+				} else if (asn1.sub.length === 2) {
+					// Parse the public key.
+					var bit_string = asn1.sub[1];
+					var sequence = bit_string.sub[0];
+					modulus = sequence.sub[0].getHexStringValue();
+					this.n = parseBigInt(modulus, 16);
+					public_exponent = sequence.sub[1].getHexStringValue();
+					this.e = parseInt(public_exponent, 16);
+				} else {
+					return false;
+				}
+				return true;
+			} catch (ex) {
+				return false;
+			}
+		};
+		/**
+		 * Translate rsa parameters in a hex encoded string representing the rsa key.
+		 *
+		 * The translation follow the ASN.1 notation :
+		 * RSAPrivateKey ::= SEQUENCE {
+		 *   version           Version,
+		 *   modulus           INTEGER,  -- n
+		 *   publicExponent    INTEGER,  -- e
+		 *   privateExponent   INTEGER,  -- d
+		 *   prime1            INTEGER,  -- p
+		 *   prime2            INTEGER,  -- q
+		 *   exponent1         INTEGER,  -- d mod (p1)
+		 *   exponent2         INTEGER,  -- d mod (q-1)
+		 *   coefficient       INTEGER,  -- (inverse of q) mod p
+		 * }
+		 * @returns {string}  DER Encoded String representing the rsa private key
+		 * @private
+		 */
+		JSEncryptRSAKey.prototype.getPrivateBaseKey = function() {
+			var options = {
+				array: [
+					new KJUR.asn1.DERInteger({
+						int: 0
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.n
+					}),
+					new KJUR.asn1.DERInteger({
+						int: this.e
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.d
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.p
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.q
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.dmp1
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.dmq1
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.coeff
+					})
+				]
+			};
+			var seq = new KJUR.asn1.DERSequence(options);
+			return seq.getEncodedHex();
+		};
+		/**
+		 * base64 (pem) encoded version of the DER encoded representation
+		 * @returns {string} pem encoded representation without header and footer
+		 * @public
+		 */
+		JSEncryptRSAKey.prototype.getPrivateBaseKeyB64 = function() {
+			return hex2b64(this.getPrivateBaseKey());
+		};
+		/**
+		 * Translate rsa parameters in a hex encoded string representing the rsa public key.
+		 * The representation follow the ASN.1 notation :
+		 * PublicKeyInfo ::= SEQUENCE {
+		 *   algorithm       AlgorithmIdentifier,
+		 *   PublicKey       BIT STRING
+		 * }
+		 * Where AlgorithmIdentifier is:
+		 * AlgorithmIdentifier ::= SEQUENCE {
+		 *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm
+		 *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)
+		 * }
+		 * and PublicKey is a SEQUENCE encapsulated in a BIT STRING
+		 * RSAPublicKey ::= SEQUENCE {
+		 *   modulus           INTEGER,  -- n
+		 *   publicExponent    INTEGER   -- e
+		 * }
+		 * @returns {string} DER Encoded String representing the rsa public key
+		 * @private
+		 */
+		JSEncryptRSAKey.prototype.getPublicBaseKey = function() {
+			var first_sequence = new KJUR.asn1.DERSequence({
+				array: [
+					new KJUR.asn1.DERObjectIdentifier({
+						oid: "1.2.840.113549.1.1.1"
+					}),
+					new KJUR.asn1.DERNull()
+				]
+			});
+			var second_sequence = new KJUR.asn1.DERSequence({
+				array: [
+					new KJUR.asn1.DERInteger({
+						bigint: this.n
+					}),
+					new KJUR.asn1.DERInteger({
+						int: this.e
+					})
+				]
+			});
+			var bit_string = new KJUR.asn1.DERBitString({
+				hex: "00" + second_sequence.getEncodedHex()
+			});
+			var seq = new KJUR.asn1.DERSequence({
+				array: [
+					first_sequence,
+					bit_string
+				]
+			});
+			return seq.getEncodedHex();
+		};
+		/**
+		 * base64 (pem) encoded version of the DER encoded representation
+		 * @returns {string} pem encoded representation without header and footer
+		 * @public
+		 */
+		JSEncryptRSAKey.prototype.getPublicBaseKeyB64 = function() {
+			return hex2b64(this.getPublicBaseKey());
+		};
+		/**
+		 * wrap the string in block of width chars. The default value for rsa keys is 64
+		 * characters.
+		 * @param {string} str the pem encoded string without header and footer
+		 * @param {Number} [width=64] - the length the string has to be wrapped at
+		 * @returns {string}
+		 * @private
+		 */
+		JSEncryptRSAKey.wordwrap = function(str, width) {
+			width = width || 64;
+			if (!str) {
+				return str;
+			}
+			var regex = "(.{1," + width + "})( +|$\n?)|(.{1," + width + "})";
+			return str.match(RegExp(regex, "g")).join("\n");
+		};
+		/**
+		 * Retrieve the pem encoded private key
+		 * @returns {string} the pem encoded private key with header/footer
+		 * @public
+		 */
+		JSEncryptRSAKey.prototype.getPrivateKey = function() {
+			var key = "-----BEGIN RSA PRIVATE KEY-----\n";
+			key += JSEncryptRSAKey.wordwrap(this.getPrivateBaseKeyB64()) + "\n";
+			key += "-----END RSA PRIVATE KEY-----";
+			return key;
+		};
+		/**
+		 * Retrieve the pem encoded public key
+		 * @returns {string} the pem encoded public key with header/footer
+		 * @public
+		 */
+		JSEncryptRSAKey.prototype.getPublicKey = function() {
+			var key = "-----BEGIN PUBLIC KEY-----\n";
+			key += JSEncryptRSAKey.wordwrap(this.getPublicBaseKeyB64()) + "\n";
+			key += "-----END PUBLIC KEY-----";
+			return key;
+		};
+		/**
+		 * Check if the object contains the necessary parameters to populate the rsa modulus
+		 * and public exponent parameters.
+		 * @param {Object} [obj={}] - An object that may contain the two public key
+		 * parameters
+		 * @returns {boolean} true if the object contains both the modulus and the public exponent
+		 * properties (n and e)
+		 * @todo check for types of n and e. N should be a parseable bigInt object, E should
+		 * be a parseable integer number
+		 * @private
+		 */
+		JSEncryptRSAKey.hasPublicKeyProperty = function(obj) {
+			obj = obj || {};
+			return (obj.hasOwnProperty("n") &&
+				obj.hasOwnProperty("e"));
+		};
+		/**
+		 * Check if the object contains ALL the parameters of an RSA key.
+		 * @param {Object} [obj={}] - An object that may contain nine rsa key
+		 * parameters
+		 * @returns {boolean} true if the object contains all the parameters needed
+		 * @todo check for types of the parameters all the parameters but the public exponent
+		 * should be parseable bigint objects, the public exponent should be a parseable integer number
+		 * @private
+		 */
+		JSEncryptRSAKey.hasPrivateKeyProperty = function(obj) {
+			obj = obj || {};
+			return (obj.hasOwnProperty("n") &&
+				obj.hasOwnProperty("e") &&
+				obj.hasOwnProperty("d") &&
+				obj.hasOwnProperty("p") &&
+				obj.hasOwnProperty("q") &&
+				obj.hasOwnProperty("dmp1") &&
+				obj.hasOwnProperty("dmq1") &&
+				obj.hasOwnProperty("coeff"));
+		};
+		/**
+		 * Parse the properties of obj in the current rsa object. Obj should AT LEAST
+		 * include the modulus and public exponent (n, e) parameters.
+		 * @param {Object} obj - the object containing rsa parameters
+		 * @private
+		 */
+		JSEncryptRSAKey.prototype.parsePropertiesFrom = function(obj) {
+			this.n = obj.n;
+			this.e = obj.e;
+			if (obj.hasOwnProperty("d")) {
+				this.d = obj.d;
+				this.p = obj.p;
+				this.q = obj.q;
+				this.dmp1 = obj.dmp1;
+				this.dmq1 = obj.dmq1;
+				this.coeff = obj.coeff;
+			}
+		};
+		return JSEncryptRSAKey;
+	}(RSAKey));
+
+	/**
+	 *
+	 * @param {Object} [options = {}] - An object to customize JSEncrypt behaviour
+	 * possible parameters are:
+	 * - default_key_size        {number}  default: 1024 the key size in bit
+	 * - default_public_exponent {string}  default: '010001' the hexadecimal representation of the public exponent
+	 * - log                     {boolean} default: false whether log warn/error or not
+	 * @constructor
+	 */
+	var JSEncrypt = /** @class */ (function() {
+		function JSEncrypt(options) {
+			options = options || {};
+			this.default_key_size = parseInt(options.default_key_size, 10) || 1024;
+			this.default_public_exponent = options.default_public_exponent ||
+			"010001"; // 65537 default openssl public exponent for rsa key type
+			this.log = options.log || false;
+			// The private and public key.
+			this.key = null;
+		}
+		/**
+		 * Method to set the rsa key parameter (one method is enough to set both the public
+		 * and the private key, since the private key contains the public key paramenters)
+		 * Log a warning if logs are enabled
+		 * @param {Object|string} key the pem encoded string or an object (with or without header/footer)
+		 * @public
+		 */
+		JSEncrypt.prototype.setKey = function(key) {
+			if (this.log && this.key) {
+				console.warn("A key was already set, overriding existing.");
+			}
+			this.key = new JSEncryptRSAKey(key);
+		};
+		/**
+		 * Proxy method for setKey, for api compatibility
+		 * @see setKey
+		 * @public
+		 */
+		JSEncrypt.prototype.setPrivateKey = function(privkey) {
+			// Create the key.
+			this.setKey(privkey);
+		};
+		/**
+		 * Proxy method for setKey, for api compatibility
+		 * @see setKey
+		 * @public
+		 */
+		JSEncrypt.prototype.setPublicKey = function(pubkey) {
+			// Sets the public key.
+			this.setKey(pubkey);
+		};
+		/**
+		 * Proxy method for RSAKey object's decrypt, decrypt the string using the private
+		 * components of the rsa key object. Note that if the object was not set will be created
+		 * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor
+		 * @param {string} str base64 encoded crypted string to decrypt
+		 * @return {string} the decrypted string
+		 * @public
+		 */
+		JSEncrypt.prototype.decrypt = function(str) {
+			// Return the decrypted string.
+			try {
+				return this.getKey().decrypt(b64tohex(str));
+			} catch (ex) {
+				return false;
+			}
+		};
+		/**
+		 * Proxy method for RSAKey object's encrypt, encrypt the string using the public
+		 * components of the rsa key object. Note that if the object was not set will be created
+		 * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor
+		 * @param {string} str the string to encrypt
+		 * @return {string} the encrypted string encoded in base64
+		 * @public
+		 */
+		JSEncrypt.prototype.encrypt = function(str) {
+			// Return the encrypted string.
+			try {
+				return hex2b64(this.getKey().encrypt(str));
+			} catch (ex) {
+				return false;
+			}
+		};
+		/**
+		 * Proxy method for RSAKey object's sign.
+		 * @param {string} str the string to sign
+		 * @param {function} digestMethod hash method
+		 * @param {string} digestName the name of the hash algorithm
+		 * @return {string} the signature encoded in base64
+		 * @public
+		 */
+		JSEncrypt.prototype.sign = function(str, digestMethod, digestName) {
+			// return the RSA signature of 'str' in 'hex' format.
+			try {
+				console.log(arguments)
+				return hex2b64(this.getKey().sign(str, digestMethod, digestName));
+			} catch (ex) {
+				console.log(ex)
+				return false;
+			}
+		};
+		/**
+		 * Proxy method for RSAKey object's verify.
+		 * @param {string} str the string to verify
+		 * @param {string} signature the signature encoded in base64 to compare the string to
+		 * @param {function} digestMethod hash method
+		 * @return {boolean} whether the data and signature match
+		 * @public
+		 */
+		JSEncrypt.prototype.verify = function(str, signature, digestMethod) {
+			// Return the decrypted 'digest' of the signature.
+			try {
+				return this.getKey().verify(str, b64tohex(signature), digestMethod);
+			} catch (ex) {
+				return false;
+			}
+		};
+		/**
+		 * Getter for the current JSEncryptRSAKey object. If it doesn't exists a new object
+		 * will be created and returned
+		 * @param {callback} [cb] the callback to be called if we want the key to be generated
+		 * in an async fashion
+		 * @returns {JSEncryptRSAKey} the JSEncryptRSAKey object
+		 * @public
+		 */
+		JSEncrypt.prototype.getKey = function(cb) {
+			// Only create new if it does not exist.
+			if (!this.key) {
+				// Get a new private key.
+				this.key = new JSEncryptRSAKey();
+				if (cb && {}.toString.call(cb) === "[object Function]") {
+					this.key.generateAsync(this.default_key_size, this.default_public_exponent,
+						cb);
+					return;
+				}
+				// Generate the key.
+				this.key.generate(this.default_key_size, this.default_public_exponent);
+			}
+			return this.key;
+		};
+		/**
+		 * Returns the pem encoded representation of the private key
+		 * If the key doesn't exists a new key will be created
+		 * @returns {string} pem encoded representation of the private key WITH header and footer
+		 * @public
+		 */
+		JSEncrypt.prototype.getPrivateKey = function() {
+			// Return the private representation of this key.
+			return this.getKey().getPrivateKey();
+		};
+		/**
+		 * Returns the pem encoded representation of the private key
+		 * If the key doesn't exists a new key will be created
+		 * @returns {string} pem encoded representation of the private key WITHOUT header and footer
+		 * @public
+		 */
+		JSEncrypt.prototype.getPrivateKeyB64 = function() {
+			// Return the private representation of this key.
+			return this.getKey().getPrivateBaseKeyB64();
+		};
+		/**
+		 * Returns the pem encoded representation of the public key
+		 * If the key doesn't exists a new key will be created
+		 * @returns {string} pem encoded representation of the public key WITH header and footer
+		 * @public
+		 */
+		JSEncrypt.prototype.getPublicKey = function() {
+			// Return the private representation of this key.
+			return this.getKey().getPublicKey();
+		};
+		/**
+		 * Returns the pem encoded representation of the public key
+		 * If the key doesn't exists a new key will be created
+		 * @returns {string} pem encoded representation of the public key WITHOUT header and footer
+		 * @public
+		 */
+		JSEncrypt.prototype.getPublicKeyB64 = function() {
+			// Return the private representation of this key.
+			return this.getKey().getPublicBaseKeyB64();
+		};
+		JSEncrypt.version = "3.0.0-rc.1";
+		return JSEncrypt;
+	}());
+
+	window2.JSEncrypt = JSEncrypt;
+
+	exports.JSEncrypt = JSEncrypt;
+	exports.default = JSEncrypt;
+
+	Object.defineProperty(exports, '__esModule', {
+		value: true
+	});
+
+})));

+ 399 - 0
src/common/mixins/canvasMixin.ts

@@ -0,0 +1,399 @@
+//@ts-nocheck
+import { Vue, Component } from 'vue-property-decorator';
+import { Getter, Mutation } from 'vuex-class';
+import { types } from '@/common/store/index';
+@Component({})
+export default class CanvasMixin extends Vue {
+	async getQr(data, fun) : Promise<any> {
+		// 获取分享小程序码
+		// let name = data.type + data.share + data.uid;
+		let name = +new Date();
+		console.log('分享码带的参数', data);
+		// let sceneStr = '';
+		// for (let key in data.scene) {
+		// 	sceneStr = sceneStr + key + '=' + data.scene[key] + '&';
+		// }
+		await this.$http
+			.post({
+				url: this.$api.Qrcode,
+				data: { page: data.page, scene: data.scene }
+			})
+			.then(res => {
+				if (!res.url) {
+					uni.showToast({
+						title: '小程序码生成失败!',
+						icon: 'none'
+					});
+					return;
+				}
+				this.base64src(
+					res.url,
+					miniImage => {
+						fun(miniImage);
+					},
+					name
+				);
+			})
+			.catch(err => {
+				uni.hideLoading();
+			});
+	}
+	//远程图片转临时文件
+	loadFile(img : string, fun) {
+		uni.downloadFile({
+			url: img,
+			success(result) {
+				if (result.statusCode === 200) {
+					fun(result.tempFilePath);
+				}
+			}
+		});
+	}
+	// base64图片 转成临时文件 传个name 保证生成的临时文件名唯一
+	base64src(base64data, cb, name) : any {
+		// #ifdef MP-WEIXIN
+		let fsm = uni.getFileSystemManager();
+		let FILE_BASE_NAME = 'tmp_base64src' + name; // 自定义文件名
+		const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || [];
+		if (!format) {
+			return new Error('ERROR_BASE64SRC_PARSE');
+		}
+		const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
+		const buffer = uni.base64ToArrayBuffer(bodyData);
+		fsm.writeFile({
+			filePath,
+			data: buffer,
+			encoding: 'binary',
+			success() {
+				console.log(5555, filePath);
+				cb(filePath);
+			},
+			fail(err) {
+				console.log(66666, err);
+				return new Error('ERROR_BASE64SRC_WRITE');
+			}
+		});
+		// #endif
+		// #ifdef APP
+		cb(base64data);
+		// const bitmap = new plus.nativeObj.Bitmap('base64')
+		// bitmap.loadBase64Data(base64data, () => {
+		// 	const url = '_doc/' + new Date().getTime() + '.png'
+		// 	bitmap.save(
+		// 		url,
+		// 		{
+		// 			overwrite: true // 是否覆盖  
+		// 			// quality: 'quality'  // 图片清晰度  
+		// 		},
+		// 		(i) => {
+		// 			cb(url);
+		// 		},
+		// 		(e) => {
+		// 			// toast('图片保存失败')
+		// 			bitmap.clear()
+		// 		}
+		// 	)
+		// },
+		// 	(e) => {
+		// 		// toast('图片保存失败')
+		// 		bitmap.clear()
+		// 	}
+		// )
+		// #endif
+	}
+	// 文字省略号
+	ellipsisText(
+		ctx,
+		content, // 文字内容
+		textWidth, // 最大宽度
+		x, // 起点横坐标
+		y, // 起点纵坐标
+		color, // 文字颜色
+		size, // 文字大小
+		lineHeight, // 行高,针对多行
+		rowNum = 1, // 行数
+		weight = 'normal ' // 文字粗细
+	) : void | boolean {
+		//textBaseline设为top,使文字的位置以左上角为基准
+		// 将传入的文字内容(字符串)分割成单个字符串数组 'text' => ['t','e','x','t']
+		if (!content) {
+			return false;
+		}
+		let contentArr : string = content.toString().split('');
+		let tempStr : string = ''; // 用来存放临时拼接的字符串
+		let resultArr : string[] = []; // 最终生成的字符串数组
+		// 将分割的单个字符拼成textWidth宽度的数组
+		for (let i = 0; i < contentArr.length; i++) {
+			// ctx.measureText => 返回文本宽度
+			if (ctx.measureText(tempStr).width < textWidth) {
+				// 当 拼接字符串宽度小于传入的宽度时,继续拼接
+				tempStr += contentArr[i];
+			} else {
+				// 当拼接字符串宽度大于等于传入的宽度时,将字符串放入数组
+				i--; // 防止当前参与循环的字符丢失
+				resultArr.push(tempStr); // 将字符串放入数组
+				tempStr = ''; // 拼接字符串清空,继续循环
+			}
+		}
+		// 结束循环后,将最后一个拼接字符串放入数组
+		resultArr.push(tempStr);
+
+		// 截取传入行数的字符串数组
+		/**
+		 * slice(start,end) 方法可从已有的数组中返回选定的元素。
+		 * start => 从何处开始选取。如果是负数,那么从数组尾部开始算起。
+		 * end => 是数组片断结束处的数组下标。默认从 start 到数组结束的所有元素。
+		 *        如果这个参数是负数,那么从数组尾部开始算起
+		 */
+		if (resultArr.length > rowNum) {
+			let sliceArr = resultArr.slice(0, rowNum);
+			// 判断截取数组的最后一个元素宽度是否和传入宽度相等,若相等,拼接"..."
+			let eslipStr = sliceArr[rowNum - 1];
+			if (ctx.measureText(eslipStr).width >= textWidth) {
+				eslipStr += '...';
+				// 将数组最后一个元素替换为拼接了'...'的字符串
+				/**
+				 * splice() 方法可删除从 index 处开始的零个或多个元素,
+				 * 并且用参数列表中声明的一个或多个值来替换那些被删除的元素
+				 * 返回的是含有被删除的元素的数组
+				 * 会直接对数组进行修改
+				 */
+				sliceArr.splice(rowNum - 1, 1, eslipStr);
+			}
+			resultArr = sliceArr;
+		}
+		/**
+		 * 绘制文字
+		 */
+		ctx.textBaseline = 'top';
+		ctx.setFillStyle(color);
+		ctx.font = weight + size + ' Arial, Helvetica, sans-serif';
+		for (let index = 0; index < resultArr.length; index++) {
+			ctx.fillText(resultArr[index], x, y + index * lineHeight);
+		}
+	}
+	//画四边形
+	lineSet(
+		ctx,
+		x : number,
+		y : number,
+		w : number,
+		h : number,
+	) {
+		// ctx,起点x坐标,起点y坐标,宽度,高度
+		ctx.beginPath();
+		ctx.strokeStyle = "#F6F6F6";
+		ctx.rect(x, y, w, h);
+		ctx.stroke();
+	}
+	// 绘制不规则圆角矩形 (任一圆角矩形)
+	roundRect(
+		ctx,
+		x : number,
+		y : number,
+		w : number,
+		h : number,
+		color : string,
+		r1 = 0,
+		r2 = 0,
+		r3 = 0,
+		r4 = 0
+	) {
+		// ctx,起点x坐标,起点y坐标,宽度,高度,圆角半径,颜色
+		ctx.beginPath();
+		ctx.moveTo(x + r4, y); // 从左上角横线起点开始画
+		ctx.lineTo(x + w - r1, y);
+		ctx.arcTo(x + w, y, x + w, y + r1, r1);
+		ctx.lineTo(x + w, y + h - r2);
+		ctx.arcTo(x + w, y + h, x + w - r2, y + h, r2);
+		ctx.lineTo(x + r3, y + h);
+		ctx.arcTo(x, y + h, x, h + y - r3, r3);
+		ctx.lineTo(x, y + r4);
+		ctx.arcTo(x, y, x + r4, y, r4);
+		ctx.closePath();
+		ctx.setFillStyle(color);
+		ctx.fill();
+	}
+	textSet(ctx, text, size, x, y, color, weight = 'normal ') {
+		ctx.setFillStyle(color);
+		ctx.font = weight + size + ' Arial, Helvetica, sans-serif';
+		ctx.fillText(text, x, y);
+	}
+	textCenterSet(ctx, text, size, x, y, color, maxWidth, weight = 'normal ') {
+		ctx.setFillStyle(color);
+		ctx.font = weight + size + ' Arial, Helvetica, sans-serif';
+		ctx.textAlign = "center";
+		ctx.fillText(text, x, y, maxWidth);
+	}
+	// 裁剪图片居中
+	drawImgInfo(ctx, dx, dy, dWidth, dHeight, head_img, imgX, imgY) {
+		if (!head_img) return;
+		// 裁剪图片居中,ctx, 位置,画布的宽高,图片,图片的实际宽高
+		let sx, sy, sWidth, sHeight;
+		if (imgX > imgY) {
+			//获取图片(裁剪)后的实际宽高,即取图片最短边作为原始边长
+			sWidth = (imgY * dWidth) / dHeight;
+			sHeight = imgY;
+			sx = (imgX - sWidth) / 2;
+			sy = 0;
+		} else {
+			sWidth = imgX;
+			sHeight = (imgX * dHeight) / dWidth;
+			sx = 0;
+			sy = (imgY - sHeight) / 2;
+		}
+		ctx.drawImage(head_img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
+	}
+	// 绘制圆角矩形图片
+	roundImg(ctx, x, y, w, h, r, color, url) {
+		// ctx,起点x坐标,起点y坐标,宽度,高度,圆角半径,颜色,图片地址
+		ctx.save(); // 保存当前环境的状态.  ctx.save();ctx.restore()避免clip对全局造成影响
+		ctx.beginPath();
+		ctx.moveTo(x + r, y); // 从左上角横线起点开始画
+		ctx.lineTo(x + w - r, y);
+		ctx.arcTo(x + w, y, x + w, y + r, r);
+		ctx.lineTo(x + w, y + h - r);
+		ctx.arcTo(x + w, y + h, x + w - r, y + h, r);
+		ctx.lineTo(x + r, y + h);
+		ctx.arcTo(x, y + h, x, h + y - r, r);
+		ctx.lineTo(x, y + r);
+		ctx.arcTo(x, y, x + r, y, r);
+		ctx.closePath();
+		ctx.clip(); // 从原始画布剪切任意形状和尺寸的区域
+		ctx.drawImage(url, x, y, w, h); // 向画布上绘制图像、画布或视频
+		ctx.restore(); // 返回之前保存过的路径状态和属性
+		console.log(222);
+	}
+	// 绘制圆角图片
+	drawCircular(ctx, width, height, x, y, url) {
+		if (!url) return;
+		ctx.save(); // 保存当前环境的状态
+		ctx.beginPath(); // 起始一条路径,或重置当前路径
+		/**
+		 * ctx.arc(x,y,r,sAngle,eAngle,counterclockwise);
+		 * x:圆的中心的 x 坐标。
+		 * y:圆的中心的 y 坐标。
+		 * r:圆的半径。
+		 * sAngle:起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。
+		 * eAngle:结束角,以弧度计。
+		 * counterclockwise:可选,规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。
+		 */
+		ctx.arc(width / 2 + x, height / 2 + y, width / 2, 0, Math.PI * 2, false); // 创建弧/曲线(用于创建圆形或部分圆)
+		ctx.clip(); // 从原始画布剪切任意形状和尺寸的区域
+		ctx.drawImage(url, x, y, width, height); // 向画布上绘制图像、画布或视频
+		ctx.restore(); // 返回之前保存过的路径状态和属性
+	}
+	// 保存分享图片
+	saveImageToPhotos(id) : void {
+		const that = this;
+		console.log(2222222);
+		uni.showLoading({
+			title: '生成图片中...'
+		});
+		/**
+		 * uni.canvasToTempFilePath(Object object, Object this)
+		 * 把当前画布指定区域的内容导出生成指定大小的图片。
+		 * 在 draw() 回调里调用该方法才能保证图片导出成功。
+		 * canvasId => 画布标识,传入 canvas 组件的 canvas-id
+		 * 使用自定义组件调取 uni.canvasToTempFilePath 接口获取不到canvas,同样的需要传入上下文的this
+		 */
+		uni.canvasToTempFilePath(
+			{
+				canvasId: id,
+				success(res) {
+					console.log('canvasTemppath', res);
+					// tempFilePath => 生成文件的临时路径 (本地路径)
+					const canvasTemppath : string = res.tempFilePath;
+					uni.hideLoading();
+					/**
+					 * uni.saveImageToPhotosAlbum(Object object)
+					 * 保存图片到系统相册。
+					 * 调用前需要 用户授权 scope.writePhotosAlbum
+					 * filePath => 图片文件路径,可以是临时文件路径或永久文件路径 (本地路径) ,不支持网络路径
+					 */
+					uni.saveImageToPhotosAlbum({
+						filePath: canvasTemppath,
+						success(res) {
+							uni.showToast({
+								title: '保存成功',
+								icon: 'success',
+								duration: 1500
+							});
+						},
+						fail(res) {
+							console.error('saveImageToPhotosAlbum-err', res);
+							if (
+								res.errMsg === 'saveImageToPhotosAlbum:fail:auth denied' ||
+								res.errMsg === 'saveImageToPhotosAlbum:fail auth deny' ||
+								res.errMsg === 'saveImageToPhotosAlbum:fail authorize no response'
+							) {
+								uni.showModal({
+									title: '提示',
+									content: '需要您授权保存相册',
+									showCancel: false,
+									success(res) {
+										/**
+										 * uni.openSetting(Object object)
+										 * 调起客户端小程序设置界面,返回用户设置的操作结果。
+										 * 设置界面只会出现小程序已经向用户请求过的权限。
+										 * withSubscriptions => 是否同时获取用户订阅消息的订阅状态,默认不获取。
+										 * withSubscriptions 只返回用户勾选过订阅面板中的“总是保持以上选择,不再询问”的订阅消息。
+										 * "scope.writePhotosAlbum" => 保存到相册的权限
+										 */
+										uni.openSetting({
+											success(settingdata) {
+												if (
+													settingdata.authSetting[
+													'scope.writePhotosAlbum'
+													]
+												) {
+													uni.showModal({
+														title: '提示',
+														content: '授权成功,再次点击图片即可保存',
+														showCancel: false
+													});
+												} else {
+													uni.showModal({
+														title: '提示',
+														content: '获取权限失败,无法保存到相册哦~',
+														showCancel: false
+													});
+												}
+											},
+											fail(res) {
+												console.error('openSetting-err', res);
+											}
+										});
+									}
+								});
+							} else {
+								uni.showToast({
+									title: '保存失败,请稍后重试~',
+									icon: 'none',
+									duration: 1500
+								});
+							}
+						}
+					});
+				},
+				fail(res) {
+					console.log('canvasToTempFilePath-fail', res);
+					if (res.errMsg === 'saveImageToPhotosAlbum:fail cancel') {
+						uni.showToast({
+							title: '取消保存',
+							icon: 'none',
+							duration: 1500
+						});
+					} else {
+						uni.showToast({
+							title: '保存失败,请稍后重试',
+							icon: 'none',
+							duration: 1500
+						});
+					}
+				}
+			},
+			this
+		);
+	}
+}

+ 42 - 0
src/common/mixins/loginMixin.ts

@@ -0,0 +1,42 @@
+import { Vue, Component } from 'vue-property-decorator';
+import {namespace} from 'vuex-class';
+import { types } from '@/common/store/index';
+const baseModule = namespace('base');
+@Component({})
+export default class LoginMixin extends Vue {
+	@baseModule.Getter('_userInfo') _userInfo: any;
+	@baseModule.Getter('_token') _token: any;
+	@baseModule.Mutation(types.SET_USERINFO) _setUserInfo: any;
+	
+	isAuthorization(){
+		if(!this._token){
+			this.$Router.push('/pages/login/login');
+			return true;
+		}
+	}
+		
+		
+	/**
+	 * 获取用户信息 
+	 * GET
+	 * */
+	getUserInfo () {
+	  uni.showLoading({
+		title: '加载中',
+	  });
+	  return this.$http.get({
+		  url:this.$api.getUserInfo
+	  })
+		.then((res:any) => {
+		  uni.hideLoading();
+		  if (res) {
+			// let {info, ...extra } = res;
+			this._setUserInfo(res)
+		  }
+		})
+		.catch((err:any) => {
+		  uni.hideLoading();
+		  console.log(err)
+		})
+	}
+}

File diff suppressed because it is too large
+ 0 - 0
src/common/qqMap.js


+ 1122 - 0
src/common/qqmap-wx-jssdk.js

@@ -0,0 +1,1122 @@
+/**
+ * 微信小程序JavaScriptSDK
+ * 
+ * @version 1.2
+ * @date 2019-03-06
+ */
+
+var ERROR_CONF = {
+    KEY_ERR: 311,
+    KEY_ERR_MSG: 'key格式错误',
+    PARAM_ERR: 310,
+    PARAM_ERR_MSG: '请求参数信息有误',
+    SYSTEM_ERR: 600,
+    SYSTEM_ERR_MSG: '系统错误',
+    WX_ERR_CODE: 1000,
+    WX_OK_CODE: 200
+};
+var BASE_URL = 'https://apis.map.qq.com/ws/';
+var URL_SEARCH = BASE_URL + 'place/v1/search';
+var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion';
+var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/';
+var URL_CITY_LIST = BASE_URL + 'district/v1/list';
+var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren';
+var URL_DISTANCE = BASE_URL + 'distance/v1/';
+var URL_DIRECTION = BASE_URL + 'direction/v1/';
+var MODE = {
+  driving: 'driving',
+  transit: 'transit'
+};
+var EARTH_RADIUS = 6378136.49;
+var Utils = {
+  /**
+  * md5加密方法
+  * 版权所有©2011 Sebastian Tschan,https://blueimp.net
+  */
+  safeAdd(x, y) {
+    var lsw = (x & 0xffff) + (y & 0xffff);
+    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+    return (msw << 16) | (lsw & 0xffff);
+  },
+  bitRotateLeft(num, cnt) {
+    return (num << cnt) | (num >>> (32 - cnt));
+  },
+  md5cmn(q, a, b, x, s, t) {
+    return this.safeAdd(this.bitRotateLeft(this.safeAdd(this.safeAdd(a, q), this.safeAdd(x, t)), s), b);
+  },
+  md5ff(a, b, c, d, x, s, t) {
+    return this.md5cmn((b & c) | (~b & d), a, b, x, s, t);
+  },
+  md5gg(a, b, c, d, x, s, t) {
+    return this.md5cmn((b & d) | (c & ~d), a, b, x, s, t);
+  },
+  md5hh(a, b, c, d, x, s, t) {
+    return this.md5cmn(b ^ c ^ d, a, b, x, s, t);
+  },
+  md5ii(a, b, c, d, x, s, t) {
+    return this.md5cmn(c ^ (b | ~d), a, b, x, s, t);
+  },
+  binlMD5(x, len) {
+    /* append padding */
+    x[len >> 5] |= 0x80 << (len % 32);
+    x[((len + 64) >>> 9 << 4) + 14] = len;
+
+    var i;
+    var olda;
+    var oldb;
+    var oldc;
+    var oldd;
+    var a = 1732584193;
+    var b = -271733879;
+    var c = -1732584194;
+    var d = 271733878;
+
+    for (i = 0; i < x.length; i += 16) {
+      olda = a;
+      oldb = b;
+      oldc = c;
+      oldd = d;
+
+      a = this.md5ff(a, b, c, d, x[i], 7, -680876936);
+      d = this.md5ff(d, a, b, c, x[i + 1], 12, -389564586);
+      c = this.md5ff(c, d, a, b, x[i + 2], 17, 606105819);
+      b = this.md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
+      a = this.md5ff(a, b, c, d, x[i + 4], 7, -176418897);
+      d = this.md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
+      c = this.md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
+      b = this.md5ff(b, c, d, a, x[i + 7], 22, -45705983);
+      a = this.md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
+      d = this.md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
+      c = this.md5ff(c, d, a, b, x[i + 10], 17, -42063);
+      b = this.md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
+      a = this.md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
+      d = this.md5ff(d, a, b, c, x[i + 13], 12, -40341101);
+      c = this.md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
+      b = this.md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
+
+      a = this.md5gg(a, b, c, d, x[i + 1], 5, -165796510);
+      d = this.md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
+      c = this.md5gg(c, d, a, b, x[i + 11], 14, 643717713);
+      b = this.md5gg(b, c, d, a, x[i], 20, -373897302);
+      a = this.md5gg(a, b, c, d, x[i + 5], 5, -701558691);
+      d = this.md5gg(d, a, b, c, x[i + 10], 9, 38016083);
+      c = this.md5gg(c, d, a, b, x[i + 15], 14, -660478335);
+      b = this.md5gg(b, c, d, a, x[i + 4], 20, -405537848);
+      a = this.md5gg(a, b, c, d, x[i + 9], 5, 568446438);
+      d = this.md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
+      c = this.md5gg(c, d, a, b, x[i + 3], 14, -187363961);
+      b = this.md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
+      a = this.md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
+      d = this.md5gg(d, a, b, c, x[i + 2], 9, -51403784);
+      c = this.md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
+      b = this.md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
+
+      a = this.md5hh(a, b, c, d, x[i + 5], 4, -378558);
+      d = this.md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
+      c = this.md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
+      b = this.md5hh(b, c, d, a, x[i + 14], 23, -35309556);
+      a = this.md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
+      d = this.md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
+      c = this.md5hh(c, d, a, b, x[i + 7], 16, -155497632);
+      b = this.md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
+      a = this.md5hh(a, b, c, d, x[i + 13], 4, 681279174);
+      d = this.md5hh(d, a, b, c, x[i], 11, -358537222);
+      c = this.md5hh(c, d, a, b, x[i + 3], 16, -722521979);
+      b = this.md5hh(b, c, d, a, x[i + 6], 23, 76029189);
+      a = this.md5hh(a, b, c, d, x[i + 9], 4, -640364487);
+      d = this.md5hh(d, a, b, c, x[i + 12], 11, -421815835);
+      c = this.md5hh(c, d, a, b, x[i + 15], 16, 530742520);
+      b = this.md5hh(b, c, d, a, x[i + 2], 23, -995338651);
+
+      a = this.md5ii(a, b, c, d, x[i], 6, -198630844);
+      d = this.md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
+      c = this.md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
+      b = this.md5ii(b, c, d, a, x[i + 5], 21, -57434055);
+      a = this.md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
+      d = this.md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
+      c = this.md5ii(c, d, a, b, x[i + 10], 15, -1051523);
+      b = this.md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
+      a = this.md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
+      d = this.md5ii(d, a, b, c, x[i + 15], 10, -30611744);
+      c = this.md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
+      b = this.md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
+      a = this.md5ii(a, b, c, d, x[i + 4], 6, -145523070);
+      d = this.md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
+      c = this.md5ii(c, d, a, b, x[i + 2], 15, 718787259);
+      b = this.md5ii(b, c, d, a, x[i + 9], 21, -343485551);
+
+      a = this.safeAdd(a, olda);
+      b = this.safeAdd(b, oldb);
+      c = this.safeAdd(c, oldc);
+      d = this.safeAdd(d, oldd);
+    }
+    return [a, b, c, d];
+  },
+  binl2rstr(input) {
+    var i;
+    var output = '';
+    var length32 = input.length * 32;
+    for (i = 0; i < length32; i += 8) {
+      output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);
+    }
+    return output;
+  },
+  rstr2binl(input) {
+    var i;
+    var output = [];
+    output[(input.length >> 2) - 1] = undefined;
+    for (i = 0; i < output.length; i += 1) {
+      output[i] = 0;
+    }
+    var length8 = input.length * 8;
+    for (i = 0; i < length8; i += 8) {
+      output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);
+    }
+    return output;
+  },
+  rstrMD5(s) {
+    return this.binl2rstr(this.binlMD5(this.rstr2binl(s), s.length * 8));
+  },
+  rstrHMACMD5(key, data) {
+    var i;
+    var bkey = this.rstr2binl(key);
+    var ipad = [];
+    var opad = [];
+    var hash;
+    ipad[15] = opad[15] = undefined;
+    if (bkey.length > 16) {
+      bkey = this.binlMD5(bkey, key.length * 8);
+    }
+    for (i = 0; i < 16; i += 1) {
+      ipad[i] = bkey[i] ^ 0x36363636;
+      opad[i] = bkey[i] ^ 0x5c5c5c5c;
+    }
+    hash = this.binlMD5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8);
+    return this.binl2rstr(this.binlMD5(opad.concat(hash), 512 + 128));
+  },
+  rstr2hex(input) {
+    var hexTab = '0123456789abcdef';
+    var output = '';
+    var x;
+    var i;
+    for (i = 0; i < input.length; i += 1) {
+      x = input.charCodeAt(i);
+      output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);
+    }
+    return output;
+  },
+  str2rstrUTF8(input) {
+    return unescape(encodeURIComponent(input));
+  },
+  rawMD5(s) {
+    return this.rstrMD5(this.str2rstrUTF8(s));
+  },
+  hexMD5(s) {
+    return this.rstr2hex(this.rawMD5(s));
+  },
+  rawHMACMD5(k, d) {
+    return this.rstrHMACMD5(this.str2rstrUTF8(k), str2rstrUTF8(d));
+  },
+  hexHMACMD5(k, d) {
+    return this.rstr2hex(this.rawHMACMD5(k, d));
+  },
+
+  md5(string, key, raw) {
+    if (!key) {
+      if (!raw) {
+        return this.hexMD5(string);
+      }
+      return this.rawMD5(string);
+    }
+    if (!raw) {
+      return this.hexHMACMD5(key, string);
+    }
+    return this.rawHMACMD5(key, string);
+  },
+  /**
+   * 得到md5加密后的sig参数
+   * @param {Object} requestParam 接口参数
+   * @param {String} sk签名字符串
+   * @param {String} featrue 方法名
+   * @return 返回加密后的sig参数
+   */
+  getSig(requestParam, sk, feature, mode) {
+    var sig = null;
+    var requestArr = [];
+    Object.keys(requestParam).sort().forEach(function(key){
+      requestArr.push(key + '=' + requestParam[key]);
+    });
+    if (feature == 'search') {
+      sig = '/ws/place/v1/search?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'suggest') {
+      sig = '/ws/place/v1/suggestion?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'reverseGeocoder') {
+      sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'geocoder') {
+      sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'getCityList') {
+      sig = '/ws/district/v1/list?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'getDistrictByCityId') {
+      sig = '/ws/district/v1/getchildren?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'calculateDistance') {
+      sig = '/ws/distance/v1/?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'direction') {
+      sig = '/ws/direction/v1/' + mode + '?' + requestArr.join('&') + sk;
+    }
+    sig = this.md5(sig);
+    return sig;
+  },
+    /**
+     * 得到终点query字符串
+     * @param {Array|String} 检索数据
+     */
+    location2query(data) {
+        if (typeof data == 'string') {
+            return data;
+        }
+        var query = '';
+        for (var i = 0; i < data.length; i++) {
+            var d = data[i];
+            if (!!query) {
+                query += ';';
+            }
+            if (d.location) {
+                query = query + d.location.lat + ',' + d.location.lng;
+            }
+            if (d.latitude && d.longitude) {
+                query = query + d.latitude + ',' + d.longitude;
+            }
+        }
+        return query;
+    },
+
+    /**
+     * 计算角度
+     */
+    rad(d) {
+      return d * Math.PI / 180.0;
+    },  
+    /**
+     * 处理终点location数组
+     * @return 返回终点数组
+     */
+    getEndLocation(location){
+      var to = location.split(';');
+      var endLocation = [];
+      for (var i = 0; i < to.length; i++) {
+        endLocation.push({
+          lat: parseFloat(to[i].split(',')[0]),
+          lng: parseFloat(to[i].split(',')[1])
+        })
+      }
+      return endLocation;
+    },
+
+    /**
+     * 计算两点间直线距离
+     * @param a 表示纬度差
+     * @param b 表示经度差
+     * @return 返回的是距离,单位m
+     */
+    getDistance(latFrom, lngFrom, latTo, lngTo) {
+      var radLatFrom = this.rad(latFrom);
+      var radLatTo = this.rad(latTo);
+      var a = radLatFrom - radLatTo;
+      var b = this.rad(lngFrom) - this.rad(lngTo);
+      var distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatFrom) * Math.cos(radLatTo) * Math.pow(Math.sin(b / 2), 2)));
+      distance = distance * EARTH_RADIUS;
+      distance = Math.round(distance * 10000) / 10000;
+      return parseFloat(distance.toFixed(0));
+    },
+    /**
+     * 使用微信接口进行定位
+     */
+    getWXLocation(success, fail, complete) {
+        wx.getLocation({
+            type: 'gcj02',
+            success: success,
+            fail: fail,
+            complete: complete
+        });
+    },
+
+    /**
+     * 获取location参数
+     */
+    getLocationParam(location) {
+        if (typeof location == 'string') {
+            var locationArr = location.split(',');
+            if (locationArr.length === 2) {
+                location = {
+                    latitude: location.split(',')[0],
+                    longitude: location.split(',')[1]
+                };
+            } else {
+                location = {};
+            }
+        }
+        return location;
+    },
+
+    /**
+     * 回调函数默认处理
+     */
+    polyfillParam(param) {
+        param.success = param.success || function () { };
+        param.fail = param.fail || function () { };
+        param.complete = param.complete || function () { };
+    },
+
+    /**
+     * 验证param对应的key值是否为空
+     * 
+     * @param {Object} param 接口参数
+     * @param {String} key 对应参数的key
+     */
+    checkParamKeyEmpty(param, key) {
+        if (!param[key]) {
+            var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key +'参数格式有误');
+            param.fail(errconf);
+            param.complete(errconf);
+            return true;
+        }
+        return false;
+    },
+
+    /**
+     * 验证参数中是否存在检索词keyword
+     * 
+     * @param {Object} param 接口参数
+     */
+    checkKeyword(param){
+        return !this.checkParamKeyEmpty(param, 'keyword');
+    },
+
+    /**
+     * 验证location值
+     * 
+     * @param {Object} param 接口参数
+     */
+    checkLocation(param) {
+        var location = this.getLocationParam(param.location);
+        if (!location || !location.latitude || !location.longitude) {
+            var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误');
+            param.fail(errconf);
+            param.complete(errconf);
+            return false;
+        }
+        return true;
+    },
+
+    /**
+     * 构造错误数据结构
+     * @param {Number} errCode 错误码
+     * @param {Number} errMsg 错误描述
+     */
+    buildErrorConfig(errCode, errMsg) {
+        return {
+            status: errCode,
+            message: errMsg
+        };
+    },
+
+    /**
+     * 
+     * 数据处理函数
+     * 根据传入参数不同处理不同数据
+     * @param {String} feature 功能名称
+     * search 地点搜索
+     * suggest关键词提示
+     * reverseGeocoder逆地址解析
+     * geocoder地址解析
+     * getCityList获取城市列表:父集
+     * getDistrictByCityId获取区县列表:子集
+     * calculateDistance距离计算
+     * @param {Object} param 接口参数
+     * @param {Object} data 数据
+     */
+    handleData(param,data,feature){
+      if (feature == 'search') {
+        var searchResult = data.data;
+        var searchSimplify = [];
+        for (var i = 0; i < searchResult.length; i++) {
+          searchSimplify.push({
+            id: searchResult[i].id || null,
+            title: searchResult[i].title || null,
+            latitude: searchResult[i].location && searchResult[i].location.lat || null,
+            longitude: searchResult[i].location && searchResult[i].location.lng || null,
+            address: searchResult[i].address || null,
+            category: searchResult[i].category || null,
+            tel: searchResult[i].tel || null,
+            adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null,
+            city: searchResult[i].ad_info && searchResult[i].ad_info.city || null,
+            district: searchResult[i].ad_info && searchResult[i].ad_info.district || null,
+            province: searchResult[i].ad_info && searchResult[i].ad_info.province || null
+          })
+        }
+        param.success(data, {
+          searchResult: searchResult,
+          searchSimplify: searchSimplify
+        })
+      } else if (feature == 'suggest') {
+        var suggestResult = data.data;
+        var suggestSimplify = [];
+        for (var i = 0; i < suggestResult.length; i++) {
+          suggestSimplify.push({
+            adcode: suggestResult[i].adcode || null,
+            address: suggestResult[i].address || null,
+            category: suggestResult[i].category || null,
+            city: suggestResult[i].city || null,
+            district: suggestResult[i].district || null,
+            id: suggestResult[i].id || null,
+            latitude: suggestResult[i].location && suggestResult[i].location.lat || null,
+            longitude: suggestResult[i].location && suggestResult[i].location.lng || null,
+            province: suggestResult[i].province || null,
+            title: suggestResult[i].title || null,
+            type: suggestResult[i].type || null
+          })
+        }
+        param.success(data, {
+          suggestResult: suggestResult,
+          suggestSimplify: suggestSimplify
+          })
+      } else if (feature == 'reverseGeocoder') {
+        var reverseGeocoderResult = data.result;
+        var reverseGeocoderSimplify = {
+          address: reverseGeocoderResult.address || null,
+          latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null,
+          longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null,
+          adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null,
+          city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || null,
+          district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.district || null,
+          nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.nation || null,
+          province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.province || null,
+          street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street || null,
+          street_number: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street_number || null,
+          recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.recommend || null,
+          rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.rough || null
+        };
+        if (reverseGeocoderResult.pois) {//判断是否返回周边poi
+          var pois = reverseGeocoderResult.pois;
+          var poisSimplify = [];
+          for (var i = 0;i < pois.length;i++) {
+            poisSimplify.push({
+              id: pois[i].id || null,
+              title: pois[i].title || null,
+              latitude: pois[i].location && pois[i].location.lat || null,
+              longitude: pois[i].location && pois[i].location.lng || null,
+              address: pois[i].address || null,
+              category: pois[i].category || null,
+              adcode: pois[i].ad_info && pois[i].ad_info.adcode || null,
+              city: pois[i].ad_info && pois[i].ad_info.city || null,
+              district: pois[i].ad_info && pois[i].ad_info.district || null,
+              province: pois[i].ad_info && pois[i].ad_info.province || null
+            })
+          }
+          param.success(data,{
+            reverseGeocoderResult: reverseGeocoderResult,
+            reverseGeocoderSimplify: reverseGeocoderSimplify,
+            pois: pois,
+            poisSimplify: poisSimplify
+          })
+        } else {
+          param.success(data, {
+            reverseGeocoderResult: reverseGeocoderResult,
+            reverseGeocoderSimplify: reverseGeocoderSimplify
+          })
+        }
+      } else if (feature == 'geocoder') {
+        var geocoderResult = data.result;
+        var geocoderSimplify = {
+          title: geocoderResult.title || null,
+          latitude: geocoderResult.location && geocoderResult.location.lat || null,
+          longitude: geocoderResult.location && geocoderResult.location.lng || null,
+          adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null,
+          province: geocoderResult.address_components && geocoderResult.address_components.province || null,
+          city: geocoderResult.address_components && geocoderResult.address_components.city || null,
+          district: geocoderResult.address_components && geocoderResult.address_components.district || null,
+          street: geocoderResult.address_components && geocoderResult.address_components.street || null,
+          street_number: geocoderResult.address_components && geocoderResult.address_components.street_number || null,
+          level: geocoderResult.level || null
+        };
+        param.success(data,{
+          geocoderResult: geocoderResult,
+          geocoderSimplify: geocoderSimplify
+        });
+      } else if (feature == 'getCityList') {
+        var provinceResult = data.result[0];
+        var cityResult = data.result[1];
+        var districtResult = data.result[2];
+        param.success(data,{
+          provinceResult: provinceResult,
+          cityResult: cityResult,
+          districtResult: districtResult
+        });
+      } else if (feature == 'getDistrictByCityId') {
+        var districtByCity = data.result[0];
+        param.success(data, districtByCity);
+      } else if (feature == 'calculateDistance') {
+        var calculateDistanceResult = data.result.elements;  
+        var distance = [];
+        for (var i = 0; i < calculateDistanceResult.length; i++){
+          distance.push(calculateDistanceResult[i].distance);
+        }   
+        param.success(data, {
+          calculateDistanceResult: calculateDistanceResult,
+          distance: distance
+          });
+      } else if (feature == 'direction') {
+        var direction = data.result.routes;
+        param.success(data,direction);
+      } else {
+        param.success(data);
+      }
+    },
+
+    /**
+     * 构造微信请求参数,公共属性处理
+     * 
+     * @param {Object} param 接口参数
+     * @param {Object} param 配置项
+     * @param {String} feature 方法名
+     */
+    buildWxRequestConfig(param, options, feature) {
+        var that = this;
+        options.header = { "content-type": "application/json" };
+        options.method = 'GET';
+        options.success = function (res) {
+            var data = res.data;
+            if (data.status === 0) {
+              that.handleData(param, data, feature);
+            } else {
+                param.fail(data);
+            }
+        };
+        options.fail = function (res) {
+            res.statusCode = ERROR_CONF.WX_ERR_CODE;
+            param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+        };
+        options.complete = function (res) {
+            var statusCode = +res.statusCode;
+            switch(statusCode) {
+                case ERROR_CONF.WX_ERR_CODE: {
+                    param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+                    break;
+                }
+                case ERROR_CONF.WX_OK_CODE: {
+                    var data = res.data;
+                    if (data.status === 0) {
+                        param.complete(data);
+                    } else {
+                        param.complete(that.buildErrorConfig(data.status, data.message));
+                    }
+                    break;
+                }
+                default:{
+                    param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG));
+                }
+
+            }
+        };
+        return options;
+    },
+
+    /**
+     * 处理用户参数是否传入坐标进行不同的处理
+     */
+    locationProcess(param, locationsuccess, locationfail, locationcomplete) {
+        var that = this;
+        locationfail = locationfail || function (res) {
+            res.statusCode = ERROR_CONF.WX_ERR_CODE;
+            param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+        };
+        locationcomplete = locationcomplete || function (res) {
+            if (res.statusCode == ERROR_CONF.WX_ERR_CODE) {
+                param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+            }
+        };
+        if (!param.location) {
+            that.getWXLocation(locationsuccess, locationfail, locationcomplete);
+        } else if (that.checkLocation(param)) {
+            var location = Utils.getLocationParam(param.location);
+            locationsuccess(location);
+        }
+    }
+};
+
+
+class QQMapWX {
+
+    /**
+     * 构造函数
+     * 
+     * @param {Object} options 接口参数,key 为必选参数
+     */
+    constructor(options) {
+        if (!options.key) {
+            throw Error('key值不能为空');
+        }
+        this.key = options.key;
+    };
+
+    /**
+     * POI周边检索
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 参数对象结构可以参考
+     * @see http://lbs.qq.com/webservice_v1/guide-search.html
+     */
+    search(options) {
+        var that = this;
+        options = options || {};
+
+        Utils.polyfillParam(options);
+
+        if (!Utils.checkKeyword(options)) {
+            return;
+        }
+
+        var requestParam = {
+            keyword: options.keyword,
+            orderby: options.orderby || '_distance',
+            page_size: options.page_size || 10,
+            page_index: options.page_index || 1,
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.address_format) {
+            requestParam.address_format = options.address_format;
+        }
+
+        if (options.filter) {
+            requestParam.filter = options.filter;
+        }
+
+        var distance = options.distance || "1000";
+        var auto_extend = options.auto_extend || 1;
+        var region = null;
+        var rectangle = null;
+
+        //判断城市限定参数
+        if (options.region) {
+          region = options.region;
+        }
+
+        //矩形限定坐标(暂时只支持字符串格式)
+        if (options.rectangle) {
+          rectangle = options.rectangle;
+        }
+
+        var locationsuccess = function (result) {        
+          if (region && !rectangle) {
+            //城市限定参数拼接
+            requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + result.longitude + ")";
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
+            }
+          } else if (rectangle && !region) {
+            //矩形搜索
+            requestParam.boundary = "rectangle(" + rectangle + ")";
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
+            }
+            } else {
+              requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend + ")";
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
+            }
+            }            
+            wx.request(Utils.buildWxRequestConfig(options, {
+                url: URL_SEARCH,
+                data: requestParam
+            }, 'search'));
+        };
+        Utils.locationProcess(options, locationsuccess);
+    };
+
+    /**
+     * sug模糊检索
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 参数对象结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-suggestion.html
+     */
+    getSuggestion(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (!Utils.checkKeyword(options)) {
+            return;
+        }
+
+        var requestParam = {
+            keyword: options.keyword,
+            region: options.region || '全国',
+            region_fix: options.region_fix || 0,
+            policy: options.policy || 0,
+            page_size: options.page_size || 10,//控制显示条数
+            page_index: options.page_index || 1,//控制页数
+            get_subpois : options.get_subpois || 0,//返回子地点
+            output: 'json',
+            key: that.key
+        };
+        //长地址
+        if (options.address_format) {
+          requestParam.address_format = options.address_format;
+        }
+        //过滤
+        if (options.filter) {
+          requestParam.filter = options.filter;
+        }
+        //排序
+        if (options.location) {
+          var locationsuccess = function (result) {
+            requestParam.location = result.latitude + ',' + result.longitude;
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest');
+            }
+            wx.request(Utils.buildWxRequestConfig(options, {
+              url: URL_SUGGESTION,
+              data: requestParam
+            }, "suggest"));      
+          };
+          Utils.locationProcess(options, locationsuccess);
+        } else {
+          if (options.sig) {
+            requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest');
+          }
+          wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_SUGGESTION,
+            data: requestParam
+          }, "suggest"));      
+        }        
+    };
+
+    /**
+     * 逆地址解析
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-gcoder.html
+     */
+    reverseGeocoder(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+        var requestParam = {
+            coord_type: options.coord_type || 5,
+            get_poi: options.get_poi || 0,
+            output: 'json',
+            key: that.key
+        };
+        if (options.poi_options) {
+            requestParam.poi_options = options.poi_options
+        }
+
+        var locationsuccess = function (result) {
+            requestParam.location = result.latitude + ',' + result.longitude;
+          if (options.sig) {
+            requestParam.sig = Utils.getSig(requestParam, options.sig, 'reverseGeocoder');
+          }
+            wx.request(Utils.buildWxRequestConfig(options, {
+                url: URL_GET_GEOCODER,
+                data: requestParam
+            }, 'reverseGeocoder'));
+        };
+        Utils.locationProcess(options, locationsuccess);
+    };
+
+    /**
+     * 地址解析
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-geocoder.html
+     */
+    geocoder(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (Utils.checkParamKeyEmpty(options, 'address')) {
+            return;
+        }
+
+        var requestParam = {
+            address: options.address,
+            output: 'json',
+            key: that.key
+        };
+
+        //城市限定
+        if (options.region) {
+          requestParam.region = options.region;
+        }
+
+        if (options.sig) {
+          requestParam.sig = Utils.getSig(requestParam, options.sig, 'geocoder');
+        }
+
+        wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_GET_GEOCODER,
+            data: requestParam
+        },'geocoder'));
+    };
+
+
+    /**
+     * 获取城市列表
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-region.html
+     */
+    getCityList(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+        var requestParam = {
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.sig) {
+          requestParam.sig = Utils.getSig(requestParam, options.sig, 'getCityList');
+        }
+
+        wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_CITY_LIST,
+            data: requestParam
+        },'getCityList'));
+    };
+
+    /**
+     * 获取对应城市ID的区县列表
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-region.html
+     */
+    getDistrictByCityId(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (Utils.checkParamKeyEmpty(options, 'id')) {
+            return;
+        }
+
+        var requestParam = {
+            id: options.id || '',
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.sig) {
+          requestParam.sig = Utils.getSig(requestParam, options.sig, 'getDistrictByCityId');
+        }
+
+        wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_AREA_LIST,
+            data: requestParam
+        },'getDistrictByCityId'));
+    };
+
+    /**
+     * 用于单起点到多终点的路线距离(非直线距离)计算:
+     * 支持两种距离计算方式:步行和驾车。
+     * 起点到终点最大限制直线距离10公里。
+     *
+     * 新增直线距离计算。
+     * 
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-distance.html
+     */
+    calculateDistance(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (Utils.checkParamKeyEmpty(options, 'to')) {
+            return;
+        }
+
+        var requestParam = {
+            mode: options.mode || 'walking',
+            to: Utils.location2query(options.to),
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.from) {
+          options.location = options.from;
+        }
+
+        //计算直线距离
+        if(requestParam.mode == 'straight'){        
+          var locationsuccess = function (result) {
+            var locationTo = Utils.getEndLocation(requestParam.to);//处理终点坐标
+            var data = {
+              message:"query ok",
+              result:{
+                elements:[]
+              },
+              status:0
+            };
+            for (var i = 0; i < locationTo.length; i++) {
+              data.result.elements.push({//将坐标存入
+                distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i].lat, locationTo[i].lng),
+                duration:0,
+                from:{
+                  lat: result.latitude,
+                  lng:result.longitude
+                },
+                to:{
+                  lat: locationTo[i].lat,
+                  lng: locationTo[i].lng
+                }
+              });            
+            }
+            var calculateResult = data.result.elements;
+            var distanceResult = [];
+            for (var i = 0; i < calculateResult.length; i++) {
+              distanceResult.push(calculateResult[i].distance);
+            }  
+            return options.success(data,{
+              calculateResult: calculateResult,
+              distanceResult: distanceResult
+            });
+          };
+          
+          Utils.locationProcess(options, locationsuccess);
+        } else {
+          var locationsuccess = function (result) {
+            requestParam.from = result.latitude + ',' + result.longitude;
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'calculateDistance');
+            }
+            wx.request(Utils.buildWxRequestConfig(options, {
+              url: URL_DISTANCE,
+              data: requestParam
+            },'calculateDistance'));
+          };
+
+          Utils.locationProcess(options, locationsuccess);
+        }      
+    };
+
+  /**
+   * 路线规划:
+   * 
+   * @param {Object} options 接口参数对象
+   * 
+   * 请求参数结构可以参考
+   * https://lbs.qq.com/webservice_v1/guide-road.html
+   */
+  direction(options) {
+    var that = this;
+    options = options || {};
+    Utils.polyfillParam(options);
+
+    if (Utils.checkParamKeyEmpty(options, 'to')) {
+      return;
+    }
+
+    var requestParam = {
+      output: 'json',
+      key: that.key
+    };
+
+    //to格式处理
+    if (typeof options.to == 'string') {
+      requestParam.to = options.to;
+    } else {
+      requestParam.to = options.to.latitude + ',' + options.to.longitude;
+    }
+    //初始化局部请求域名
+    var SET_URL_DIRECTION = null;
+    //设置默认mode属性
+    options.mode = options.mode || MODE.driving;
+
+    //设置请求域名
+    SET_URL_DIRECTION = URL_DIRECTION + options.mode;
+
+    if (options.from) {
+      options.location = options.from;
+    }
+
+    if (options.mode == MODE.driving) {
+      if (options.from_poi) {
+        requestParam.from_poi = options.from_poi;
+      }
+      if (options.heading) {
+        requestParam.heading = options.heading;
+      }
+      if (options.speed) {
+        requestParam.speed = options.speed;
+      }
+      if (options.accuracy) {
+        requestParam.accuracy = options.accuracy;
+      }
+      if (options.road_type) {
+        requestParam.road_type = options.road_type;
+      }
+      if (options.to_poi) {
+        requestParam.to_poi = options.to_poi;
+      }
+      if (options.from_track) {
+        requestParam.from_track = options.from_track;
+      }
+      if (options.waypoints) {
+        requestParam.waypoints = options.waypoints;
+      }
+      if (options.policy) {
+        requestParam.policy = options.policy;
+      }
+      if (options.plate_number) {
+        requestParam.plate_number = options.plate_number;
+      }
+    }
+
+    if (options.mode == MODE.transit) {
+      if (options.departure_time) {
+        requestParam.departure_time = options.departure_time;
+      }
+      if (options.policy) {
+        requestParam.policy = options.policy;
+      }
+    } 
+
+    var locationsuccess = function (result) {
+      requestParam.from = result.latitude + ',' + result.longitude;
+      if (options.sig) {
+        requestParam.sig = Utils.getSig(requestParam, options.sig, 'direction',options.mode);
+      }
+      wx.request(Utils.buildWxRequestConfig(options, {
+        url: SET_URL_DIRECTION,
+        data: requestParam
+      }, 'direction'));
+    };
+
+    Utils.locationProcess(options, locationsuccess);
+  }
+};
+
+module.exports = QQMapWX;

File diff suppressed because it is too large
+ 0 - 0
src/common/qqmap-wx-jssdk.min.js


+ 211 - 0
src/common/store/base/index.ts

@@ -0,0 +1,211 @@
+import {
+	SET_TOKEN,
+	LOGOUT,
+	SET_ISLOGIN,
+	SET_USERINFO,
+	SET_REFERRERID,
+	SET_ISNOTICE,
+	SET_TABBARINDEX,
+	SET_STARTTIME,
+	SET_ENDTIME,
+	SET_ISPLAY,
+	SET_ADDRESS,
+	SET_REMARK,
+	SET_GOODS,
+	SET_SEARCHHISTORY,
+	SET_CARTGOODS,
+	ADD_CARTGOODS,
+	EMPTY_SEARCHHISTORY,
+	DELETE_SEARCHHISTORY,
+	SET_SEARCHHISTORY2,
+	EMPTY_SEARCHHISTORY2,
+	DELETE_SEARCHHISTORY2,
+	SET_YES_NUM,
+	SET_ORDER_INFO,
+	SET_BANK_CARD,
+	SET_SELF_PICKUP_POINT
+} from '@/common/store/types';
+
+const module = {
+  namespaced: true,
+  state() {
+    return {
+       token: uni.getStorageSync('token'),
+	   // token: '',
+	   isLogin: uni.getStorageSync('isLogin') || false,
+	   userInfo: uni.getStorageSync('userInfo') || {},
+	   referrerId: uni.getStorageSync('referrerId'),
+	   isPlay: uni.getStorageSync('isPlay'),
+	   goods: uni.getStorageSync('goods') || [],
+	   searchHistory: uni.getStorageSync('searchHistory')||[],
+	   searchHistory2: uni.getStorageSync('searchHistory2')||[],
+	   cartGoods: uni.getStorageSync('cartGoods') || [],
+	   address: null,
+	   remark: '',
+	   isNotice: false,
+	   tabBarIndex: 0,
+	   startTime: '',
+	   endTime:'',
+	   yesNum: 0,
+	   bankCard: {},
+	   selfPickupPoint: {},
+	   orderInfo: {
+		   sumCount: 0,
+		   sumPrice: 0,
+		   data: []
+	   }
+    }
+  },
+  getters: {
+    _token:(state:any)=> state.token,
+	_isLogin: (state:any) => state.isLogin,
+	_referrerId: (state:any) => state.referrerId,
+	_userInfo:(state:any)=> JSON.parse(JSON.stringify(state.userInfo)) || {},
+	_isNotice: (state:any) => state.isNotice,
+	_tabBarIndex: (state:any) => state.tabBarIndex,
+	_startTime: (state:any) => state.startTime,
+	_endTime: (state:any) => state.endTime,
+	_isPlay: (state:any) => state.isPlay,
+	_address: (state:any) => state.address,
+	_remark: (state:any) => state.remark,
+	_goods: (state:any) => state.goods,
+	_searchHistory: (state: any) => JSON.parse(JSON.stringify(state.searchHistory)),
+	_searchHistory2: (state: any) => JSON.parse(JSON.stringify(state.searchHistory2)),
+	_cartGoods:(state: any) => JSON.parse(JSON.stringify(state.cartGoods)),
+	_yesNum:(state:any) => state.yesNum || 0,
+	_orderInfo:(state:any) => state.orderInfo,
+	_bankCard:(state:any) => state.bankCard,
+	_selfPickupPoint:(state:any) => state.selfPickupPoint,
+  },
+  mutations: {
+    // 登录成功将, token保存在localStorage中
+    [SET_TOKEN]: (state:any, data:any) => {
+      uni.setStorageSync('token', data);
+      state.token = data;
+    },
+	// 退出登录将, token清空
+	[LOGOUT]: (state:any) => {
+	  uni.removeStorageSync('token');
+	  uni.removeStorageSync('userInfo');
+	  uni.removeStorageSync('isLogin');
+	  state.token = '';
+	  state.userInfo = null;
+	  state.isLogin = false;
+	},
+	// 登录状态
+	[SET_ISLOGIN]: (state:any, data:any) => {
+	  uni.setStorageSync('isLogin', data);
+	  state.isLogin = data;
+	},
+	// 用户信息
+	[SET_USERINFO]: (state:any, data:any) => {
+	  uni.setStorageSync('userInfo', data);
+	  state.userInfo = data;
+	},
+	// 保存推荐人
+	[SET_REFERRERID]: (state:any, data:any) => {
+	  uni.setStorageSync('referrerId', data);
+	  state.referrerId = data;
+	},
+	// tabbar
+	[SET_TABBARINDEX]: (state:any, data:any) => {
+		state.tabBarIndex = data;
+	},
+	[SET_STARTTIME]: (state:any, data:any) => {
+	  state.startTime = data;
+	},
+	[SET_ENDTIME]: (state:any, data:any) => {
+	  state.endTime = data;
+	},
+	[SET_ADDRESS]: (state:any, data:any) => {
+	  state.address = data;
+	},
+	[SET_GOODS]: (state:any, data:any) => {
+	  uni.setStorageSync('goods', data);
+	  state.goods = data;
+	},
+	[SET_YES_NUM]: (state:any, data:any) => {
+	  state.yesNum = data;
+	},
+	// 购物车数据
+	[SET_CARTGOODS]: (state: any, data: any) => {
+		uni.setStorageSync('cartGoods', data);
+		state.cartGoods = data;
+	},
+	// 搜索历史数据
+	[SET_SEARCHHISTORY]: (state: any, data: any) => {
+		if(!data) return;
+		let val:Array<any> = state.searchHistory||[]
+		let index = val.findIndex((item: any) => item === data);
+		(index > -1) && val.splice(index,1);
+		val.unshift(data);
+		val = val.slice(0, 10);
+		state.searchHistory = val;
+		uni.setStorageSync('searchHistory', val);
+	},
+	// 清空搜索记录
+	[EMPTY_SEARCHHISTORY]:(state: any, data: any) => {
+		state.searchHistory = [];
+		uni.setStorageSync('searchHistory', []);
+	},
+	[DELETE_SEARCHHISTORY]: (state: any, data: any) => {
+		if(!data) return;
+		let val:Array<any> = state.searchHistory||[]
+		let index = val.findIndex((item: any) => item === data);
+		(index > -1) && val.splice(index,1);
+		uni.setStorageSync('searchHistory', val);
+	},
+	// 搜索历史数据
+	[SET_SEARCHHISTORY2]: (state: any, data: any) => {
+		if(!data) return;
+		let val:Array<any> = state.searchHistory2||[]
+		let index = val.findIndex((item: any) => item === data);
+		(index > -1) && val.splice(index,1);
+		val.unshift(data);
+		uni.setStorageSync('searchHistory2', val);
+	},
+	// 清空搜索记录
+	[EMPTY_SEARCHHISTORY2]:(state: any, data: any) => {
+		state.searchHistory2 = [];
+		uni.setStorageSync('searchHistory2', []);
+	},
+	[DELETE_SEARCHHISTORY2]: (state: any, data: any) => {
+		if(!data) return;
+		let val:Array<any> = state.searchHistory2||[]
+		let index = val.findIndex((item: any) => item === data);
+		(index > -1) && val.splice(index,1);
+		uni.setStorageSync('searchHistory2', val);
+	},
+	[SET_ORDER_INFO]: (state:any, data:any) => {
+	  state.orderInfo = data;
+	},
+	[SET_BANK_CARD]: (state:any, data:any) => {
+	  state.bankCard = data;
+	},
+	[SET_SELF_PICKUP_POINT]: (state:any, data:any) => {
+	  state.selfPickupPoint = data;
+	},
+  },
+  actions: {
+    [ADD_CARTGOODS]:({state,commit}:any,goodsInfo: any) => {
+    	const cartFlag = state.cartGoods.find((res: any)=> res.sku_id == goodsInfo.sku_id)
+    	
+    	if(!cartFlag){
+    		goodsInfo.check = false;
+    		state.cartGoods.unshift(goodsInfo);
+    	}else{
+    		state.cartGoods.forEach((res: any)=>{
+    			if(res.sku_id == goodsInfo.sku_id){
+    				res.num += goodsInfo.num;
+    			}
+    		})
+    		console.log('数量加的有点问题呀',state.cartGoods,goodsInfo.num);
+    	}
+    	commit(SET_CARTGOODS,state.cartGoods);
+    	console.log('state.cartGoods------>',state.cartGoods)
+    	console.log('goodsInfo------>',goodsInfo)
+    }
+  }
+}
+
+export default module;

+ 45 - 0
src/common/store/canvas/index.ts

@@ -0,0 +1,45 @@
+// @ts-nocheck
+import {
+	SET_CANVASDATA,
+	REFRESHCANVAS
+} from '@/common/store/types';
+
+let canvasData ={
+	avatar: '',
+	title: '',
+	shareImg: '',
+	qr: '',
+	tips: '推荐给你一个好店'
+}
+const module = {
+  namespaced: true,
+  state() {
+    return {
+	   canvasData: uni.getStorageSync('canvasData')|| canvasData,
+    }
+  },
+  getters: {
+	_canvasData:(state:any)=> state.canvasData
+  },
+  mutations: {
+	// 海报信息
+	[SET_CANVASDATA]: (state:any, { data, type}) => {
+	  let newobj = uni.getStorageSync('canvasData') || canvasData
+	  newobj[type] = data;
+	  uni.setStorageSync(`canvasData`, newobj)
+	  state.canvasData[type] = data
+	},
+	 // 清空当前缓存
+	 [REFRESHCANVAS]:(state:any, type:string)=>{
+	    let newobj = uni.getStorageSync('canvasData') || canvasData
+	    newobj[type] = img[type]
+	    uni.setStorageSync(`canvasData`, newobj)
+	    state.canvasData[type] = img[type]
+	  }
+  },
+  actions: {
+    
+  }
+}
+
+export default module;

+ 29 - 0
src/common/store/index.ts

@@ -0,0 +1,29 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import * as types from './types';
+import base from './base';
+import canvas from './canvas';
+
+Vue.use(Vuex);
+
+const store = new Vuex.Store({
+	state: {
+		
+	},
+	mutations: {
+		
+	},
+	getters: {
+		
+	},
+	modules: {
+		base,
+		canvas,
+	}
+});
+
+export default store;
+
+export {
+	types,
+};

+ 56 - 0
src/common/store/types.ts

@@ -0,0 +1,56 @@
+const SET_TOKEN = 'set_token';
+const LOGOUT = 'logout';
+const SET_ISLOGIN = 'setIsLogin';
+const SET_USERINFO = 'setUserInfo';
+const SET_REFERRERID = 'setReferrerId';
+const SET_CANVASDATA = 'setCanvasData';
+const REFRESHCANVAS = 'refreshCanvas';
+const SET_TABBARINDEX = 'tabBarIndex';
+const SET_ISNOTICE = 'setIsNotice';
+const SET_STARTTIME = 'set_startTime';
+const SET_ENDTIME = 'set_endtTime';
+const SET_ISPLAY = 'set_isPlay';
+const SET_ADDRESS = 'set_address';
+const SET_REMARK = 'set_remark';
+const SET_GOODS = 'set_goods';
+const SET_SEARCHHISTORY = 'set_searchHistory';
+const SET_CARTGOODS = 'set_cartGoods';
+const ADD_CARTGOODS = 'add_cartGoods';
+const EMPTY_SEARCHHISTORY = 'empty_searchHistory';
+const DELETE_SEARCHHISTORY = 'delete_searchHistory';
+const SET_SEARCHHISTORY2 = 'set_searchHistory2';
+const EMPTY_SEARCHHISTORY2 = 'empty_searchHistory2';
+const DELETE_SEARCHHISTORY2 = 'delete_searchHistory2';
+const SET_YES_NUM = 'setYesNum';
+const SET_ORDER_INFO = 'setOrderInfo';
+const SET_BANK_CARD = 'setBankCard';
+const SET_SELF_PICKUP_POINT = 'setSelfPickupPoint';
+export {
+  SET_TOKEN,
+  SET_ISLOGIN,
+  SET_USERINFO,
+  SET_REFERRERID,
+  LOGOUT,
+  SET_CANVASDATA,
+  REFRESHCANVAS,
+  SET_TABBARINDEX,
+  SET_ISNOTICE,
+  SET_STARTTIME,
+  SET_ENDTIME,
+  SET_ISPLAY,
+  SET_ADDRESS,
+  SET_REMARK,
+  SET_GOODS,
+  SET_SEARCHHISTORY,
+  SET_CARTGOODS,
+  ADD_CARTGOODS,
+  EMPTY_SEARCHHISTORY,
+  DELETE_SEARCHHISTORY,
+  SET_SEARCHHISTORY2,
+  EMPTY_SEARCHHISTORY2,
+  DELETE_SEARCHHISTORY2,
+  SET_YES_NUM,
+  SET_ORDER_INFO,
+  SET_BANK_CARD,
+  SET_SELF_PICKUP_POINT
+};

+ 143 - 0
src/common/utils.ts

@@ -0,0 +1,143 @@
+//加法函数,用来得到精确的加法结果 
+export function accAdd(arg1: any,arg2: any){ 
+var r1,r2,m; 
+try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} 
+try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} 
+m=Math.pow(10,Math.max(r1,r2)) 
+return (arg1*m+arg2*m)/m 
+} 
+
+
+//减法函数,用来得到精确的加法结果 
+//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 
+//调用:accAdd(arg1,arg2) 
+//返回值:arg1加上arg2的精确结果 
+export function accSub(arg1: any,arg2: any){
+    var r1,r2,m,n;
+    try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
+    try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
+    m=Math.pow(10,Math.max(r1,r2));
+    //动态控制精度长度
+    n=(r1>=r2)?r1:r2;
+    return ((arg1*m-arg2*m)/m).toFixed(n);
+}
+
+//乘法函数
+export function accMul(arg1:any, arg2:any){
+   var t1 = 0, t2 = 0,s1 = arg1.toString(), s2 = arg2.toString(),r1,r2;
+    try {t1= s1.split(".")[1].length;}catch (e) {}
+    try {t2= s2.split(".")[1].length;}catch (e) {}
+	r1 = Number(s1.replace(".", ""));
+	r2 = Number(s2.replace(".", ""));
+    return r1 * r2 / Math.pow(10, t1+t2);
+}
+
+// 除法
+export function accDiv(arg1:any, arg2:any) {
+    var t1 = 0, t2 = 0, s1 = arg1.toString(), s2 = arg2.toString(),r1,r2;
+    try {t1 = s1.split(".")[1].length;}catch (e) {}
+    try {t2 = s2.split(".")[1].length;}catch (e) {}
+	r1 = Number(s1.replace(".", ""));
+	r2 = Number(s2.replace(".", ""));
+	return (r1 / r2) * Math.pow(10, t2 - t1);
+}
+/**
+ * 格式化数字
+ * @param num 要格式化的数字
+ * @param len 保留小数位数默认2
+ * @param type 格式化方式0:四舍五入 1:进一  2:舍去 默认0
+ * @return string
+ */
+ export function format_number(num:any,len:any,type:any) {
+    len = len > 0 && len <= 20 ? len : 2;
+    var result = parseFloat(num);
+    num=isNaN(result)?0:result;
+    var numpow=Math.pow(10,len);
+    var numcheng=accMul(num,numpow);
+    if(type==1){//ceil进一 
+    	result = Math.ceil(numcheng);
+    }else if(type==2){//floor舍去
+    	result = Math.floor(numcheng);
+    }else{//round四舍五入 
+    	result = Math.round(numcheng);
+    }
+    result =accDiv(result,numpow);
+    var s_x = result.toString();
+    var pos_decimal = s_x.indexOf('.');
+    if (pos_decimal < 0) {pos_decimal = s_x.length;s_x += '.';}
+    while (s_x.length <= pos_decimal + len) {s_x += '0';}
+    return s_x;
+}
+
+export function Arabia_To_SimplifiedChinese(Num: any): any {
+  for (let i = Num.length - 1; i >= 0; i--) {
+      Num = Num.replace(',', '');// 替换Num中的“,”
+      Num = Num.replace(' ', '');// 替换Num中的空格
+  }
+
+  // 验证输入的字符是否为数字
+  if (isNaN(Num)) {
+      alert('请检查小写金额是否正确');
+      return;
+  }
+
+  // 字符处理完毕后开始转换,采用前后两部分分别转换(小数点为界限)
+ var part = String(Num).split('.');
+
+  // 初始化一个字符串
+  var newchar = '';
+
+  // 小数点前进行转化
+  for (let i = part[0].length - 1; i >= 0; i--) {
+      // 若数量超过拾亿单位,提示
+      if (part[0].length > 10) {
+          // alert("位数过大,无法计算");
+          return '';
+      }
+
+     let tmpnewchar:string = '';
+     let perchar:any = part[0].charAt(i);
+
+      switch (perchar) {
+          case '0': tmpnewchar = '零' + tmpnewchar; break;
+          case '1': tmpnewchar = '一' + tmpnewchar; break;
+          case '2': tmpnewchar = '二' + tmpnewchar; break;
+          case '3': tmpnewchar = '三' + tmpnewchar; break;
+          case '4': tmpnewchar = '四' + tmpnewchar; break;
+          case '5': tmpnewchar = '五' + tmpnewchar; break;
+          case '6': tmpnewchar = '六' + tmpnewchar; break;
+          case '7': tmpnewchar = '七' + tmpnewchar; break;
+          case '8': tmpnewchar = '八' + tmpnewchar; break;
+          case '9': tmpnewchar = '九' + tmpnewchar; break;
+      }
+      switch (part[0].length - i - 1) {
+          case 0: tmpnewchar = tmpnewchar; break;
+          case 1: if (perchar != 0) tmpnewchar = tmpnewchar + '十'; break;
+          case 2: if (perchar != 0) tmpnewchar = tmpnewchar + '百'; break;
+          case 3: if (perchar != 0) tmpnewchar = tmpnewchar + '千'; break;
+          case 4: tmpnewchar = tmpnewchar + '万'; break;
+          case 5: if (perchar != 0) tmpnewchar = tmpnewchar + '十'; break;
+          case 6: if (perchar != 0) tmpnewchar = tmpnewchar + '百'; break;
+          case 7: if (perchar != 0) tmpnewchar = tmpnewchar + '千'; break;
+          case 8: tmpnewchar = tmpnewchar + '亿'; break;
+          case 9: tmpnewchar = tmpnewchar + '十'; break;
+      }
+      newchar = tmpnewchar + newchar;
+  }
+  // 替换所有无用汉字,直到没有此类无用的数字为止
+  while (newchar.search('零零') != -1 || newchar.search('零亿') != -1 || newchar.search('亿万') != -1 || newchar.search('零万') != -1) {
+      newchar = newchar.replace('零亿', '亿');
+      newchar = newchar.replace('亿万', '亿');
+      newchar = newchar.replace('零万', '万');
+      newchar = newchar.replace('零零', '零');
+  }
+  // 替换以“一十”开头的,为“十”
+  if (newchar.indexOf('一十') == 0) {
+      newchar = newchar.substr(1);
+  }
+  // 替换以“零”结尾的,为“”
+  if (newchar.lastIndexOf('零') == newchar.length - 1) {
+      newchar = newchar.substr(0, newchar.length - 1);
+  }
+  return newchar;
+}

File diff suppressed because it is too large
+ 4 - 0
src/common/weapp.qrcode.min.js


+ 215 - 0
src/components/AddressPopup/AddressPopup.vue

@@ -0,0 +1,215 @@
+<template>
+	<view class='content'>
+		<uni-popup ref="popup" :safe-area="false">
+			<view class="address-popup">
+				<view class="address-head">
+					<view class="address-title">选择地址</view>
+					<!-- <text class="icon" @click="close">&#xe6f0;</text> -->
+				</view>
+				<view class="noData" v-if="!addressList.length">
+					<text class="word16">暂无地址</text>
+				</view>
+				<scroll-view class="scroll-styl" scroll-y="true">
+					<view class="address-card" v-for="(item,index) in addressList" :key="index"
+						@click="clickAddress(item)">
+						<view class="address-left">
+							<!-- 选中的圈圈 -->
+							<view class="quan-styl" v-if="item.id == chooseId">
+								<view class="small-quan"></view>
+							</view>
+							<!-- 未选中圈圈 -->
+							<view class="quan-styl1" v-else></view>
+							<view class="address-info">
+								<view class="address-detail">
+									{{item.province_str + item.city_str + item.county_str + item.address}}
+								</view>
+								<view class="user-info">
+									<view class="user-name">{{item.name}}</view>
+									<view class="user-phone">{{item.phone}}</view>
+								</view>
+							</view>
+						</view>
+						<text class="address-right" @click.stop="toEditress(item)">&#xe890;</text>
+					</view>
+				</scroll-view>
+				<view class="btn-styl" @click="toAddress">+新增收货地址</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+<script lang='ts'>
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit
+	} from 'vue-property-decorator';
+	import {
+		Getter,
+		Mutation
+	} from 'vuex-class';
+	@Component({})
+
+	export default class AddressPopup extends Vue {
+		@Prop({
+			default: []
+		}) addressList ? : any;
+		@Prop({
+			default: 0
+		}) chooseId ? : any; //选中id
+
+		// methods-----------------------
+		//选择收货地址
+		// clickAddress(val: any): void {
+		// 	console.log('地址信息',val);
+		// 	this.chooseId = val.uid;
+		// 	this.close();
+		// }
+		// 跳转新增收货地址页
+		toAddress() {
+			(this.$refs.popup as any).close();
+			this.clickDetail();
+			this.$Router.push({
+				path: '/packages/order/address-detail',
+				query: {}
+			});
+		}
+		// 跳转新增收货地址页
+		toEditress(val: any) {
+			(this.$refs.popup as any).close();
+			this.clickDetail();
+			this.$Router.push({
+				path: '/packages/order/address-detail?id=' + val.id,
+				query: {}
+			});
+		}
+		//打开弹窗
+		open(): void {
+			(this.$refs.popup as any).open('bottom');
+		}
+		//关闭弹窗
+		close(): void {
+			(this.$refs.popup as any).close();
+		}
+
+		// emit----------------------
+		@Emit('clickAddress')
+		clickAddress(val: any) {
+			console.log('地址信息', val);
+			// this.chooseId = val.id;
+			this.close();
+			return val
+		}
+		
+		@Emit('clickDetail')
+		clickDetail() {}
+
+	}
+</script>
+
+<style lang='scss' scoped>
+	.content {
+		box-sizing: border-box;
+
+		.address-popup {
+			background-color: #F9F9F9;
+			border-top-left-radius: vw(34);
+			border-top-right-radius: vw(34);
+			padding: 0 vw(20) vw(16);
+
+			.address-head {
+				text-align: center;
+
+				.address-title {
+					@include word-vw(18, $gray3);
+					padding: vw(18) 0;
+				}
+
+				.icon {
+					@include icon(16, $gray9);
+					position: absolute;
+					right: 20px;
+					top: 20px;
+				}
+			}
+
+			.noData {
+				width: 100%;
+				margin: vw(20) 0;
+				@include flex-y(center, center);
+
+				.word16 {
+					/* margin-left: vw(20); */
+					@include word-vw(16, $gray9);
+				}
+			}
+
+			.scroll-styl {
+				max-height: vw(300);
+				overflow-y: scroll;
+				@include hide-scrollbar();
+
+				.address-card {
+					@include flex-x();
+					padding: vw(15) vw(22) vw(12) vw(18);
+					border-bottom: 1px solid #F8F8F8;
+					background: #fff;
+					border-radius: vw(8);
+
+					.address-left {
+						@include flex-x(flex-start);
+
+						.quan-styl {
+							@include flex-x(center);
+							@include wh(20, 20);
+							border-radius: 100%;
+							border: 2px solid $bk-color;
+
+							.small-quan {
+								@include wh(14, 14);
+								border-radius: 100%;
+								background-color: $bk-color;
+							}
+						}
+
+						.quan-styl1 {
+							@include wh(20, 20);
+							border-radius: 100%;
+							border: 2px solid #EFEFEF;
+						}
+
+						.address-info {
+							margin-left: vw(9);
+
+							.address-detail {
+								max-width: vw(260);
+								font-size: vw(12);
+								@include ellipsis();
+							}
+
+							.user-info {
+								@include flex-x(flex-start);
+								@include word-vw(11, $gray9);
+								margin-top: vw(4);
+
+								.user-phone {
+									margin-left: vw(16);
+								}
+							}
+						}
+
+					}
+				}
+			}
+
+			.address-right {
+				@include icon(18, $gray9);
+			}
+		}
+
+		.btn-styl {
+			@include solid-btn(335, 50, #ffffff, 10);
+			margin: vw(20) auto vw(10) auto;
+		}
+	}
+</style>

+ 162 - 0
src/components/AppShare/AppShare.vue

@@ -0,0 +1,162 @@
+<template>
+	<view class="share-container">
+		<uni-popup ref="popup" type="center">
+			<view class="wrapper" v-if="popShow">
+				<canvas canvas-id="shareCanvas" class="canvas" style="width: 250px;height:430px;"></canvas>
+				<view class="bottom">
+					<button class="bottom-btn" open-type="share">
+						<image :src="static + 'wechat.png'"></image>
+						<view class="text">分享好友</view>
+					</button>
+					<view class="bottom-btn" @click="saveImageToPhotos('shareCanvas')">
+						<image :src="static + 'download.png'"></image>
+						<view class="text">保存图片</view>
+					</view>
+				</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script lang="ts">
+	// @ts-nocheck
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Mixins
+	} from 'vue-property-decorator';
+	import {
+		types
+	} from '@/common/store';
+	import {
+		OSS_STATIC
+	} from '@/common/constants';
+	import canvasMixin from '@/common/mixins/canvasMixin.ts';
+	import {
+		namespace
+	} from 'vuex-class';
+	const canvasModule = namespace('canvas');
+	const baseModule = namespace('base');
+	@Component({})
+	export default class ShopShare extends Mixins(canvasMixin) {
+		@canvasModule.Getter('_canvasData') _canvasData: any;
+		@baseModule.Getter('_userInfo') _userInfo: any;
+		popShow: boolean = false;
+		static: string = OSS_STATIC;
+
+		closePop(): void {
+			(this.$refs.popup as any).close();
+			this.popShow = false;
+		}
+		openPop(): void {
+			(this.$refs.popup as any).open();
+			this.popShow = true;
+			uni.showLoading({
+				title: '加载中'
+			});
+			this.drawPoster();
+		}
+		mounted() {}
+		drawPoster(): void {
+			// 绘制海报
+			// 注意:page页面canvas-id获取ctx,组件需传this
+			const that = this;
+			const ctx = uni.createCanvasContext('shareCanvas', this);
+			// 绘制白色底
+			this.roundRect(ctx, 0, 0, 250, 460, '#ffffff', 8, 8, 8, 8);
+			this.roundRect(ctx, 0, 0, 250, 48, '#fff', 8, 0, 0, 8);
+			// 绘制头像
+			this.drawCircular(ctx, 24, 24, 13, 15, that._canvasData.avatar);
+			this.ellipsisText(
+				ctx,
+				that._userInfo.nickname,
+				200,
+				43,
+				13,
+				'#999',
+				'10px',
+				14
+			);
+			// 绘制宣传语
+			this.ellipsisText(
+				ctx,
+				that._canvasData.tips,
+				200,
+				43,
+				27,
+				'#454545',
+				'10px',
+				14
+			);
+			this.textSet(ctx, '”', '45px', 135, 20, '#ddd');
+			// 绘制店铺图片
+			this.drawImgInfo(
+				ctx,
+				10,
+				50,
+				230,
+				230,
+				that._canvasData.shareImg,
+				// that._canvasData.width,
+				// that._canvasData.height
+			);
+			// this.textSet(ctx, that._canvasData.title, '24px', 13, 360, '#333', 'bold ');
+			this.textSet(ctx, '爱润妍', '10px', 13, 348, '#999');
+			this.textSet(ctx, '爱润妍', '14px', 13, 365, '#000', 'bold ');
+			// // 小程序码
+			ctx.drawImage(that._canvasData.qr, 150, 295, 90, 90);
+			this.textSet(ctx, '长按识别进店铺', '10px', 90, 400, '#999999');
+			ctx.draw(true, () => {
+				console.log('draw,true');
+				uni.hideLoading();
+			});
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.wrapper {
+		@include flex-y();
+		width: 250px;
+	}
+
+	.canvas {
+		border-radius: vw(5);
+		overflow: hidden;
+		margin-top: vw(50);
+	}
+
+	.bottom {
+		width: 230px;
+		margin-top: vw(15);
+		@include flex-x();
+
+		.text {
+			@include word-vw(14, white);
+			line-height: vw(20);
+			margin-top: vw(5);
+		}
+
+		image {
+			width: vw(60);
+			height: vw(60);
+		}
+	}
+
+	button {
+		background: none;
+		line-height: 1;
+		padding: 0;
+		margin: 0;
+	}
+
+	button::after {
+		border: 0px;
+	}
+
+	.button-hover {
+		background: none;
+	}
+</style>

+ 94 - 0
src/components/BottomPopup/BottomPopup.vue

@@ -0,0 +1,94 @@
+<template>
+	<view>
+		<uni-popup ref="bottom_popup" type="bottom" :is-mask-click="true" :safe-area="false">
+			<view class="long-data-picker">
+				<view class="title">{{title}}</view>
+				<view class="item" v-for="(item, index) in dataList" :key="index" @click="chooseDate(item)">
+					{{item[keyName] || item}}
+				</view>
+				<!-- <view class="cancel item" @click="close">取消</view> -->
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "long-date",
+		props: {
+			dataList: {
+				type: Array,
+				default: []
+			},
+			chooseNum: {
+				type: Number,
+				default: 30
+			},
+			title: {
+				type: String,
+				default: '选择类型'
+			},
+			keyName: {
+				type: String,
+				default: ''
+			},
+			valueName: {
+				type: String,
+				default: ''
+			}
+
+		},
+		data() {
+			return {};
+		},
+		methods: {
+			//打开弹窗
+			open() {
+				this.$refs.bottom_popup.open();
+			},
+			// //关闭弹窗
+			close() {
+				this.$refs.bottom_popup.close();
+			},
+
+			//选择
+			chooseDate(item) {
+				this.$emit("selected", item);
+				this.close();
+			}
+
+		},
+
+	}
+</script>
+
+<style lang='scss' scoped>
+	.long-data-picker{
+		width: 100%;
+		box-sizing: border-box;
+		border-top-right-radius: vw(34);
+		border-top-left-radius: vw(34);
+		background: #F9F9F9;
+		@include flex-y();
+		padding: vw(24) 0;
+	}
+	.title{
+		width: 100%;
+		@include word-vw(18, #333);
+		@include flex-x(center);
+		margin: vw(0) 0 vw(16);
+	}
+	.item {
+		width: vw(345);
+		height: vw(60);
+		border-radius: vw(8);
+		background: #fff;
+		@include flex-x(center);
+		@include word-vw(16, #333);
+		margin-bottom: vw(10);
+	}
+
+	/* .cancel {
+		border-top: vw(3) solid #ddd;
+	} */
+</style>

+ 197 - 0
src/components/GoodItem/GoodItem.vue

@@ -0,0 +1,197 @@
+<template>
+	<view class="good-item" v-if="item" :style="{background: bg,marginBottom: (marginBottom / 3.75) + 'vw'}"
+		@click="handleDetail">
+		<view class="top">
+			<image :src="item.masterPic" class="img" mode="aspectFit"></image>
+		</view>
+		<view class="bottom">
+			<view class="good-name">{{item.name}}</view>
+			<!-- <view class="tip">{{item.tagline}}</view> -->
+			<!-- <view class="pre-price">原价:<text>{{item.linePrice | moneyFormat}}</text></view> -->
+			<view class="price-box price-box2" v-if="item.normalPrice">
+				<view class="price" v-if="_token"><text>¥</text>{{item.minPrice | priceFormat}}<text>代理价</text></view>
+				<view class="bottom-price">
+					<view class="pre-price2" v-if="_token">¥{{item.normalPrice | priceFormat}}</view>
+					<view class="pre-price" v-if="_token">¥{{item.linePrice | priceFormat}}</view>
+				</view>
+				<view class="good-car">
+					<!-- <view class="icon-box">
+						<IconText :code="`\ue767`" size="18" :color="item.totalStock ? '#168D64' : '#168D64'">
+						</IconText>
+					</view> -->
+					<image class="pic" :src="staticUrl ? staticUrl + 'good-card-btn.png' : ''" mode=""></image>
+				</view>
+			</view>
+			<view class="price-box" v-else>
+				<view class="price"><text>¥</text>{{item.minPrice | priceFormat}}</view>
+				<!-- <view class="price" v-else><text>¥</text>{{item.linePrice | priceFormat}}</view> -->
+				<view class="pre-price">¥{{item.linePrice | priceFormat}}</view>
+				<view class="good-car">
+					<!-- <view class="icon-box">
+						<IconText :code="`\ue767`" size="18" :color="item.totalStock ? '#168D64' : '#168D64'">
+						</IconText>
+					</view> -->
+					<image class="pic" :src="staticUrl ? staticUrl + 'good-card-btn.png' : ''" mode=""></image>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Mixins
+	} from 'vue-property-decorator';
+	import loginMixin from '@/common/mixins/loginMixin.ts';
+	@Component({
+		filters: {
+			moneyFormat(val : any) {
+				if (!+val) return '0.00';
+				return (+val).toFixed(2);
+			},
+			priceFormat(val : any) {
+				if (!+val) return '0.00';
+				if (+val > 10000) {
+					return (+val / 10000).toFixed(2) + 'w';
+				}
+				return (+val).toFixed(2);
+			}
+		}
+	})
+	export default class Navbar extends Mixins(loginMixin) {
+		@Prop({
+			default: {}
+		})
+		private item! : any; // 
+
+		@Prop({
+			default: '#fff'
+		})
+		private bg ?: string; // 
+
+		@Prop({
+			default: 10
+		})
+		private marginBottom ?: number; // 
+		staticUrl : string = this.$oss_url; //oss地址
+
+		handleDetail() {
+			this.$Router.push({
+				path: '/packages/goods/good-detail',
+				query: {
+					id: this.item.id,
+					gid: this.item.gid
+				}
+			});
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.good-item {
+		// width: 100%;
+		@include flex-y(flex-start);
+		border-radius: vw(5);
+		box-sizing: border-box;
+		overflow: hidden;
+		width: vw(172);
+		position: relative;
+
+		.top {
+			background: #E7E7E7;
+			width: vw(172);
+			height: vw(172);
+			@include flex-x(center);
+
+			.img {
+				width: vw(150);
+				height: vw(150);
+				display: block;
+			}
+		}
+
+		.bottom {
+			padding: vw(8);
+			width: 100%;
+			box-sizing: border-box;
+			overflow: hidden;
+
+			.good-name {
+				// overflow-y: hidden;
+				// @include ellipsis();
+				@include word-vw(14, #333);
+				@include multi(2);
+				line-height: vw(16);
+				height: vw(32);
+				width: vw(156);
+				// height: 2em;
+				font-weight: 550;
+			}
+
+			.tip {
+				width: vw(156);
+				@include word-vw(12, #999);
+				@include ellipsis();
+			}
+
+			.price-box {
+				width: 100%;
+				@include flex-x(flex-start);
+				margin-top: vw(8);
+				overflow: hidden;
+
+				.price {
+					@include word-vw(14, $btn-color);
+					font-weight: 600;
+
+					text {
+						@include word-vw(10, $btn-color);
+						font-weight: normal;
+						margin-left: vw(3);
+					}
+				}
+
+				.good-car {
+					flex: 1;
+					@include flex-x(flex-end);
+					position: absolute;
+					right: vw(6);
+
+					.pic {
+						@include wh(24, 24);
+					}
+
+					.icon-box {
+						@include wh(21, 21);
+						border-radius: vw(11);
+						@include flex-x(center);
+						background: #fff;
+						box-shadow: 0px 2px 2px 0px rgba(161, 161, 161, 0.44);
+					}
+				}
+			}
+
+			.price-box2 {
+				@include flex-y(flex-start, flex-start);
+				.bottom-price{
+					@include flex-x(flex-start);
+					.pre-price2{
+						@include word-vw(12, #333);
+					}
+				}
+			}
+
+			.pre-price {
+				@include word-vw(12, #999);
+				margin-left: vw(5);
+				text-decoration: line-through;
+
+				text {
+					text-decoration: line-through;
+				}
+			}
+		}
+	}
+</style>

+ 218 - 0
src/components/GoodsShare/GoodsShare.vue

@@ -0,0 +1,218 @@
+<template>
+	<view class="share-container">
+		<uni-popup ref="popup" type="center">
+			<view class="wrapper" v-if="popShow">
+				<canvas canvas-id="shareCanvas" class="canvas" style="width: 250px;height:430px;"></canvas>
+				<view class="bottom">
+					<!-- #ifdef MP-WEIXIN -->
+					<button class="bottom-btn" open-type="share">
+						<image :src="static + 'wechat.png'"></image>
+						<view class="text">介绍好友</view>
+					</button>
+					<!-- #endif -->
+					<view class="bottom-btn" @click="saveImageToPhotos('shareCanvas')">
+						<image :src="static + 'download.png'"></image>
+						<view class="text">保存图片</view>
+					</view>
+				</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script lang="ts">
+	// @ts-nocheck
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Mixins
+	} from 'vue-property-decorator';
+	import {
+		types
+	} from '@/common/store';
+	import {
+		OSS_STATIC
+	} from '@/common/constants';
+	import canvasMixin from '@/common/mixins/canvasMixin.ts';
+	import {
+		namespace
+	} from 'vuex-class';
+	const canvasModule = namespace('canvas');
+	const baseModule = namespace('base');
+	@Component({})
+	export default class ShopShare extends Mixins(canvasMixin) {
+		@canvasModule.Getter('_canvasData') _canvasData: any;
+		@baseModule.Getter('_userInfo') _userInfo: any;
+		@baseModule.Getter('_goods') goodsInfo: any;
+		popShow: boolean = false;
+		static: string = OSS_STATIC;
+
+		closePop(): void {
+			(this.$refs.popup as any).close();
+			this.popShow = false;
+		}
+		openPop(): void {
+			(this.$refs.popup as any).open();
+			this.popShow = true;
+			uni.showLoading({
+				title: '加载中'
+			});
+			this.$nextTick(()=> {
+				this.drawPoster();
+			})
+		}
+		mounted() {}
+		drawPoster(): void {
+			// 绘制海报
+			// 注意:page页面canvas-id获取ctx,组件需传this
+			const that = this;
+			const ctx = uni.createCanvasContext('shareCanvas', this);
+			// 绘制白色底
+			this.roundRect(ctx, 0, 0, 250, 460, '#ffffff', 8, 8, 8, 8);
+			// 绘制头像
+			this.drawCircular(ctx, 24, 24, 13, 15, that._canvasData.avatar);
+			this.ellipsisText(
+				ctx,
+				that._userInfo.nickname,
+				// '爱润妍',
+				200,
+				43,
+				13,
+				'#999',
+				'10px',
+				14
+			);
+			// 绘制宣传语
+			this.ellipsisText(
+				ctx,
+				'推荐给你一个好物',
+				200,
+				43,
+				27,
+				'#454545',
+				'10px',
+				14
+			);
+			this.textSet(ctx, '”', '45px', 135, 20, '#ddd');
+			// 绘制店铺图片
+			this.drawImgInfo(
+				ctx,
+				10,
+				50,
+				230,
+				230,
+				that.goodsInfo.goodImg,
+				that.goodsInfo.width,
+				that.goodsInfo.height
+			);
+			// 商品标题
+			this.ellipsisText(
+				ctx,
+				that.goodsInfo.name,
+				180,
+				11,
+				291,
+				'#000',
+				'14px',
+				20,
+				1,
+				'bold '
+			);
+			// 商品副标题
+			this.ellipsisText(
+				ctx,
+				that.goodsInfo.tagline,
+				150,
+				11,
+				311,
+				'#999',
+				'10px',
+				14,
+				1
+			);
+			//  划线价
+			let linePrice:string = '¥0.00';
+			if (that.goodsInfo.linePrice) {
+				linePrice = '¥' + Number(that.goodsInfo.linePrice).toFixed(2);
+			}
+			// this.textSet(ctx, linePrice, '12px', 11, 375, '#999');
+			// let lineH = ctx.measureText(linePrice).width;
+			// ctx.moveTo(14, 382);
+			// ctx.lineTo(lineH + 14, 382);
+			// ctx.strokeStyle = '#999999';
+			// ctx.stroke();
+			// 商品价格
+			this.textSet(ctx, '¥', '12px', 11, 362, '#000', 'bold ');
+			this.textSet(
+				ctx,
+				Number(that.goodsInfo.minPrice).toFixed(2),
+				'19px',
+				19,
+				356,
+				'#000',
+				'bold '
+			);
+			// // 小程序码
+			ctx.drawImage(that._canvasData.goodQr, 150, 295, 90, 90);
+			this.textSet(ctx, '长按识别进店铺', '10px', 90, 400, '#999999');
+			ctx.draw(true, () => {
+				console.log('draw,true');
+				uni.hideLoading();
+			});
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.wrapper {
+		@include flex-y();
+		width: 250px;
+	}
+
+	.canvas {
+		border-radius: vw(5);
+		overflow: hidden;
+		margin-top: vw(50);
+	}
+
+	.bottom {
+		width: 230px;
+		margin-top: vw(15);
+		
+		/* #ifdef MP-WEIXIN */
+		@include flex-x();
+		/* #endif */
+		
+		/* #ifndef MP-WEIXIN */
+		@include flex-x(center);
+		/* #endif */
+
+		.text {
+			@include word-vw(14, white);
+			line-height: vw(20);
+			margin-top: vw(5);
+		}
+
+		image {
+			width: vw(60);
+			height: vw(60);
+		}
+	}
+
+	button {
+		background: none;
+		line-height: 1;
+		padding: 0;
+		margin: 0;
+	}
+
+	button::after {
+		border: 0px;
+	}
+
+	.button-hover {
+		background: none;
+	}
+</style>

+ 42 - 0
src/components/IconText/IconText.vue

@@ -0,0 +1,42 @@
+<template>
+	<view class="iconfont-box">
+		<text :style="{ color: color, 'font-size': size/3.75 + 'vw' }" class="icon">{{code}}</text>
+	</view>
+</template>
+
+<script lang="ts">
+	/**
+	 * Icons 图标
+	 * @property {Number} size 图标大小
+	 * @property {String} color 图标颜色
+	 * @property {String} code 图标样式 &#xe705; -> \ue705
+	 * @event {Function} click 点击 Icon 触发事件
+	 */
+	import { Component, Prop, Vue, Emit } from 'vue-property-decorator';
+	@Component({})
+	export default class Icon extends Vue {
+		@Prop({
+			default: ''
+		})
+		code !: string
+		@Prop({
+			default: '#333333'
+		})
+		color ? : string
+		@Prop({
+			default: 16
+		})
+		size ? : number
+	}
+</script>
+
+<style lang="scss" scoped>
+	// @import './iconfont.css';
+	.iconfont-box{
+		@include flex-x(center);
+	}
+	.icon {
+		font-family: 'iconfont' !important;
+		font-style: normal;
+	}
+</style>

+ 539 - 0
src/components/IconText/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 1499 - 0
src/components/IconText/demo_index.html

@@ -0,0 +1,1499 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3695491" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe76b;</span>
+                <div class="name">分组 14</div>
+                <div class="code-name">&amp;#xe76b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe76c;</span>
+                <div class="name">分组 6</div>
+                <div class="code-name">&amp;#xe76c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe76d;</span>
+                <div class="name">分组 5</div>
+                <div class="code-name">&amp;#xe76d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe76e;</span>
+                <div class="name">分组 3 (2)</div>
+                <div class="code-name">&amp;#xe76e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe736;</span>
+                <div class="name">Shape (1)</div>
+                <div class="code-name">&amp;#xe736;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe737;</span>
+                <div class="name">分组 1 (9)</div>
+                <div class="code-name">&amp;#xe737;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe738;</span>
+                <div class="name">分组 8</div>
+                <div class="code-name">&amp;#xe738;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe739;</span>
+                <div class="name">分组 1 (4)</div>
+                <div class="code-name">&amp;#xe739;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe73a;</span>
+                <div class="name">分组 5 (2)</div>
+                <div class="code-name">&amp;#xe73a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe73b;</span>
+                <div class="name">编组 3</div>
+                <div class="code-name">&amp;#xe73b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe73c;</span>
+                <div class="name">分组 2</div>
+                <div class="code-name">&amp;#xe73c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe73d;</span>
+                <div class="name">分组 5 (1)</div>
+                <div class="code-name">&amp;#xe73d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe73e;</span>
+                <div class="name">形状 (2)</div>
+                <div class="code-name">&amp;#xe73e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe73f;</span>
+                <div class="name">分组 7</div>
+                <div class="code-name">&amp;#xe73f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe740;</span>
+                <div class="name">lajitongshanchu</div>
+                <div class="code-name">&amp;#xe740;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe741;</span>
+                <div class="name">shopping_cart (1)</div>
+                <div class="code-name">&amp;#xe741;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe742;</span>
+                <div class="name">分组 3 (1)</div>
+                <div class="code-name">&amp;#xe742;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe743;</span>
+                <div class="name">形状 (3)</div>
+                <div class="code-name">&amp;#xe743;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe744;</span>
+                <div class="name">位置</div>
+                <div class="code-name">&amp;#xe744;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe745;</span>
+                <div class="name">分组 1 (12)</div>
+                <div class="code-name">&amp;#xe745;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe746;</span>
+                <div class="name">形状 (1)</div>
+                <div class="code-name">&amp;#xe746;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe747;</span>
+                <div class="name">分组 1 (5)</div>
+                <div class="code-name">&amp;#xe747;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe748;</span>
+                <div class="name">分组 1</div>
+                <div class="code-name">&amp;#xe748;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe749;</span>
+                <div class="name">b-dyjlr</div>
+                <div class="code-name">&amp;#xe749;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe74a;</span>
+                <div class="name">分组 1 (1)</div>
+                <div class="code-name">&amp;#xe74a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe74b;</span>
+                <div class="name">分组 1 (8)</div>
+                <div class="code-name">&amp;#xe74b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe74c;</span>
+                <div class="name">Vector</div>
+                <div class="code-name">&amp;#xe74c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe74d;</span>
+                <div class="name">分组 1 (3)</div>
+                <div class="code-name">&amp;#xe74d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe74e;</span>
+                <div class="name">Back Chevron</div>
+                <div class="code-name">&amp;#xe74e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe74f;</span>
+                <div class="name">编组 2</div>
+                <div class="code-name">&amp;#xe74f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe750;</span>
+                <div class="name">shopping_cart</div>
+                <div class="code-name">&amp;#xe750;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe751;</span>
+                <div class="name">分组 1 (10)</div>
+                <div class="code-name">&amp;#xe751;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe752;</span>
+                <div class="name">分组 4</div>
+                <div class="code-name">&amp;#xe752;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe753;</span>
+                <div class="name">分组 3</div>
+                <div class="code-name">&amp;#xe753;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe754;</span>
+                <div class="name">分组 1 (6)</div>
+                <div class="code-name">&amp;#xe754;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe755;</span>
+                <div class="name">Combined Shape</div>
+                <div class="code-name">&amp;#xe755;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe756;</span>
+                <div class="name">Shape</div>
+                <div class="code-name">&amp;#xe756;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe757;</span>
+                <div class="name">蒙版分组</div>
+                <div class="code-name">&amp;#xe757;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe758;</span>
+                <div class="name">bianji-2</div>
+                <div class="code-name">&amp;#xe758;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe759;</span>
+                <div class="name">形状</div>
+                <div class="code-name">&amp;#xe759;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe75a;</span>
+                <div class="name">路径 1 (1)</div>
+                <div class="code-name">&amp;#xe75a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe75b;</span>
+                <div class="name">account_circle (1)</div>
+                <div class="code-name">&amp;#xe75b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe75c;</span>
+                <div class="name">并集</div>
+                <div class="code-name">&amp;#xe75c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe75d;</span>
+                <div class="name">分组 3 (3)</div>
+                <div class="code-name">&amp;#xe75d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe75e;</span>
+                <div class="name">路径 1</div>
+                <div class="code-name">&amp;#xe75e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe75f;</span>
+                <div class="name">路径备份</div>
+                <div class="code-name">&amp;#xe75f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe760;</span>
+                <div class="name">分组 1 (7)</div>
+                <div class="code-name">&amp;#xe760;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe761;</span>
+                <div class="name">分组 1 (2)</div>
+                <div class="code-name">&amp;#xe761;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe762;</span>
+                <div class="name">gouwuche-3 copy</div>
+                <div class="code-name">&amp;#xe762;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe763;</span>
+                <div class="name">分组 1 (11)</div>
+                <div class="code-name">&amp;#xe763;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe764;</span>
+                <div class="name">Shape Copy 20备份 2</div>
+                <div class="code-name">&amp;#xe764;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe765;</span>
+                <div class="name">分组 2 (1)</div>
+                <div class="code-name">&amp;#xe765;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe766;</span>
+                <div class="name">account_circle</div>
+                <div class="code-name">&amp;#xe766;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe767;</span>
+                <div class="name">搜索图标</div>
+                <div class="code-name">&amp;#xe767;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe768;</span>
+                <div class="name">编组 8复制</div>
+                <div class="code-name">&amp;#xe768;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe769;</span>
+                <div class="name">fenxiang</div>
+                <div class="code-name">&amp;#xe769;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe76a;</span>
+                <div class="name">分组 13</div>
+                <div class="code-name">&amp;#xe76a;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1665726138405') format('woff2'),
+       url('iconfont.woff?t=1665726138405') format('woff'),
+       url('iconfont.ttf?t=1665726138405') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu141"></span>
+            <div class="name">
+              分组 14
+            </div>
+            <div class="code-name">.iiry-a-fenzu141
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu6"></span>
+            <div class="name">
+              分组 6
+            </div>
+            <div class="code-name">.iiry-a-fenzu6
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu5"></span>
+            <div class="name">
+              分组 5
+            </div>
+            <div class="code-name">.iiry-a-fenzu5
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu32"></span>
+            <div class="name">
+              分组 3 (2)
+            </div>
+            <div class="code-name">.iiry-a-fenzu32
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-Shape1"></span>
+            <div class="name">
+              Shape (1)
+            </div>
+            <div class="code-name">.iiry-a-Shape1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu19"></span>
+            <div class="name">
+              分组 1 (9)
+            </div>
+            <div class="code-name">.iiry-a-fenzu19
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu8"></span>
+            <div class="name">
+              分组 8
+            </div>
+            <div class="code-name">.iiry-a-fenzu8
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu14"></span>
+            <div class="name">
+              分组 1 (4)
+            </div>
+            <div class="code-name">.iiry-a-fenzu14
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu52"></span>
+            <div class="name">
+              分组 5 (2)
+            </div>
+            <div class="code-name">.iiry-a-fenzu52
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-bianzu3"></span>
+            <div class="name">
+              编组 3
+            </div>
+            <div class="code-name">.iiry-a-bianzu3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu2"></span>
+            <div class="name">
+              分组 2
+            </div>
+            <div class="code-name">.iiry-a-fenzu2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu51"></span>
+            <div class="name">
+              分组 5 (1)
+            </div>
+            <div class="code-name">.iiry-a-fenzu51
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-xingzhuang2"></span>
+            <div class="name">
+              形状 (2)
+            </div>
+            <div class="code-name">.iiry-a-xingzhuang2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu7"></span>
+            <div class="name">
+              分组 7
+            </div>
+            <div class="code-name">.iiry-a-fenzu7
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-lajitongshanchu"></span>
+            <div class="name">
+              lajitongshanchu
+            </div>
+            <div class="code-name">.iiry-lajitongshanchu
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-shopping_cart1"></span>
+            <div class="name">
+              shopping_cart (1)
+            </div>
+            <div class="code-name">.iiry-a-shopping_cart1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu31"></span>
+            <div class="name">
+              分组 3 (1)
+            </div>
+            <div class="code-name">.iiry-a-fenzu31
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-xingzhuang3"></span>
+            <div class="name">
+              形状 (3)
+            </div>
+            <div class="code-name">.iiry-a-xingzhuang3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-weizhi"></span>
+            <div class="name">
+              位置
+            </div>
+            <div class="code-name">.iiry-weizhi
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu112"></span>
+            <div class="name">
+              分组 1 (12)
+            </div>
+            <div class="code-name">.iiry-a-fenzu112
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-xingzhuang1"></span>
+            <div class="name">
+              形状 (1)
+            </div>
+            <div class="code-name">.iiry-a-xingzhuang1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu15"></span>
+            <div class="name">
+              分组 1 (5)
+            </div>
+            <div class="code-name">.iiry-a-fenzu15
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu1"></span>
+            <div class="name">
+              分组 1
+            </div>
+            <div class="code-name">.iiry-a-fenzu1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-b-dyjlr"></span>
+            <div class="name">
+              b-dyjlr
+            </div>
+            <div class="code-name">.iiry-b-dyjlr
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu11"></span>
+            <div class="name">
+              分组 1 (1)
+            </div>
+            <div class="code-name">.iiry-a-fenzu11
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu18"></span>
+            <div class="name">
+              分组 1 (8)
+            </div>
+            <div class="code-name">.iiry-a-fenzu18
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-Vector"></span>
+            <div class="name">
+              Vector
+            </div>
+            <div class="code-name">.iiry-Vector
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu13"></span>
+            <div class="name">
+              分组 1 (3)
+            </div>
+            <div class="code-name">.iiry-a-fenzu13
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-BackChevron"></span>
+            <div class="name">
+              Back Chevron
+            </div>
+            <div class="code-name">.iiry-a-BackChevron
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-bianzu2"></span>
+            <div class="name">
+              编组 2
+            </div>
+            <div class="code-name">.iiry-a-bianzu2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-shopping_cart"></span>
+            <div class="name">
+              shopping_cart
+            </div>
+            <div class="code-name">.iiry-shopping_cart
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu110"></span>
+            <div class="name">
+              分组 1 (10)
+            </div>
+            <div class="code-name">.iiry-a-fenzu110
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu4"></span>
+            <div class="name">
+              分组 4
+            </div>
+            <div class="code-name">.iiry-a-fenzu4
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu3"></span>
+            <div class="name">
+              分组 3
+            </div>
+            <div class="code-name">.iiry-a-fenzu3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu16"></span>
+            <div class="name">
+              分组 1 (6)
+            </div>
+            <div class="code-name">.iiry-a-fenzu16
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-CombinedShape"></span>
+            <div class="name">
+              Combined Shape
+            </div>
+            <div class="code-name">.iiry-a-CombinedShape
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-Shape"></span>
+            <div class="name">
+              Shape
+            </div>
+            <div class="code-name">.iiry-Shape
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-mengbanfenzu"></span>
+            <div class="name">
+              蒙版分组
+            </div>
+            <div class="code-name">.iiry-mengbanfenzu
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-bianji-2"></span>
+            <div class="name">
+              bianji-2
+            </div>
+            <div class="code-name">.iiry-bianji-2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-xingzhuang"></span>
+            <div class="name">
+              形状
+            </div>
+            <div class="code-name">.iiry-xingzhuang
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-lujing11"></span>
+            <div class="name">
+              路径 1 (1)
+            </div>
+            <div class="code-name">.iiry-a-lujing11
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-account_circle1"></span>
+            <div class="name">
+              account_circle (1)
+            </div>
+            <div class="code-name">.iiry-a-account_circle1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-bingji"></span>
+            <div class="name">
+              并集
+            </div>
+            <div class="code-name">.iiry-bingji
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu33"></span>
+            <div class="name">
+              分组 3 (3)
+            </div>
+            <div class="code-name">.iiry-a-fenzu33
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-lujing1"></span>
+            <div class="name">
+              路径 1
+            </div>
+            <div class="code-name">.iiry-a-lujing1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-lujingbeifen"></span>
+            <div class="name">
+              路径备份
+            </div>
+            <div class="code-name">.iiry-lujingbeifen
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu17"></span>
+            <div class="name">
+              分组 1 (7)
+            </div>
+            <div class="code-name">.iiry-a-fenzu17
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu12"></span>
+            <div class="name">
+              分组 1 (2)
+            </div>
+            <div class="code-name">.iiry-a-fenzu12
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-gouwuche-3copy"></span>
+            <div class="name">
+              gouwuche-3 copy
+            </div>
+            <div class="code-name">.iiry-a-gouwuche-3copy
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu111"></span>
+            <div class="name">
+              分组 1 (11)
+            </div>
+            <div class="code-name">.iiry-a-fenzu111
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-ShapeCopy20beifen2"></span>
+            <div class="name">
+              Shape Copy 20备份 2
+            </div>
+            <div class="code-name">.iiry-a-ShapeCopy20beifen2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu21"></span>
+            <div class="name">
+              分组 2 (1)
+            </div>
+            <div class="code-name">.iiry-a-fenzu21
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-account_circle"></span>
+            <div class="name">
+              account_circle
+            </div>
+            <div class="code-name">.iiry-account_circle
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-sousuotubiao"></span>
+            <div class="name">
+              搜索图标
+            </div>
+            <div class="code-name">.iiry-sousuotubiao
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-bianzu8fuzhi"></span>
+            <div class="name">
+              编组 8复制
+            </div>
+            <div class="code-name">.iiry-a-bianzu8fuzhi
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-fenxiang"></span>
+            <div class="name">
+              fenxiang
+            </div>
+            <div class="code-name">.iiry-fenxiang
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iiry-a-fenzu131"></span>
+            <div class="name">
+              分组 13
+            </div>
+            <div class="code-name">.iiry-a-fenzu131
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont iiry-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu141"></use>
+                </svg>
+                <div class="name">分组 14</div>
+                <div class="code-name">#iiry-a-fenzu141</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu6"></use>
+                </svg>
+                <div class="name">分组 6</div>
+                <div class="code-name">#iiry-a-fenzu6</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu5"></use>
+                </svg>
+                <div class="name">分组 5</div>
+                <div class="code-name">#iiry-a-fenzu5</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu32"></use>
+                </svg>
+                <div class="name">分组 3 (2)</div>
+                <div class="code-name">#iiry-a-fenzu32</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-Shape1"></use>
+                </svg>
+                <div class="name">Shape (1)</div>
+                <div class="code-name">#iiry-a-Shape1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu19"></use>
+                </svg>
+                <div class="name">分组 1 (9)</div>
+                <div class="code-name">#iiry-a-fenzu19</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu8"></use>
+                </svg>
+                <div class="name">分组 8</div>
+                <div class="code-name">#iiry-a-fenzu8</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu14"></use>
+                </svg>
+                <div class="name">分组 1 (4)</div>
+                <div class="code-name">#iiry-a-fenzu14</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu52"></use>
+                </svg>
+                <div class="name">分组 5 (2)</div>
+                <div class="code-name">#iiry-a-fenzu52</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-bianzu3"></use>
+                </svg>
+                <div class="name">编组 3</div>
+                <div class="code-name">#iiry-a-bianzu3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu2"></use>
+                </svg>
+                <div class="name">分组 2</div>
+                <div class="code-name">#iiry-a-fenzu2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu51"></use>
+                </svg>
+                <div class="name">分组 5 (1)</div>
+                <div class="code-name">#iiry-a-fenzu51</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-xingzhuang2"></use>
+                </svg>
+                <div class="name">形状 (2)</div>
+                <div class="code-name">#iiry-a-xingzhuang2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu7"></use>
+                </svg>
+                <div class="name">分组 7</div>
+                <div class="code-name">#iiry-a-fenzu7</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-lajitongshanchu"></use>
+                </svg>
+                <div class="name">lajitongshanchu</div>
+                <div class="code-name">#iiry-lajitongshanchu</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-shopping_cart1"></use>
+                </svg>
+                <div class="name">shopping_cart (1)</div>
+                <div class="code-name">#iiry-a-shopping_cart1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu31"></use>
+                </svg>
+                <div class="name">分组 3 (1)</div>
+                <div class="code-name">#iiry-a-fenzu31</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-xingzhuang3"></use>
+                </svg>
+                <div class="name">形状 (3)</div>
+                <div class="code-name">#iiry-a-xingzhuang3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-weizhi"></use>
+                </svg>
+                <div class="name">位置</div>
+                <div class="code-name">#iiry-weizhi</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu112"></use>
+                </svg>
+                <div class="name">分组 1 (12)</div>
+                <div class="code-name">#iiry-a-fenzu112</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-xingzhuang1"></use>
+                </svg>
+                <div class="name">形状 (1)</div>
+                <div class="code-name">#iiry-a-xingzhuang1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu15"></use>
+                </svg>
+                <div class="name">分组 1 (5)</div>
+                <div class="code-name">#iiry-a-fenzu15</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu1"></use>
+                </svg>
+                <div class="name">分组 1</div>
+                <div class="code-name">#iiry-a-fenzu1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-b-dyjlr"></use>
+                </svg>
+                <div class="name">b-dyjlr</div>
+                <div class="code-name">#iiry-b-dyjlr</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu11"></use>
+                </svg>
+                <div class="name">分组 1 (1)</div>
+                <div class="code-name">#iiry-a-fenzu11</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu18"></use>
+                </svg>
+                <div class="name">分组 1 (8)</div>
+                <div class="code-name">#iiry-a-fenzu18</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-Vector"></use>
+                </svg>
+                <div class="name">Vector</div>
+                <div class="code-name">#iiry-Vector</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu13"></use>
+                </svg>
+                <div class="name">分组 1 (3)</div>
+                <div class="code-name">#iiry-a-fenzu13</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-BackChevron"></use>
+                </svg>
+                <div class="name">Back Chevron</div>
+                <div class="code-name">#iiry-a-BackChevron</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-bianzu2"></use>
+                </svg>
+                <div class="name">编组 2</div>
+                <div class="code-name">#iiry-a-bianzu2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-shopping_cart"></use>
+                </svg>
+                <div class="name">shopping_cart</div>
+                <div class="code-name">#iiry-shopping_cart</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu110"></use>
+                </svg>
+                <div class="name">分组 1 (10)</div>
+                <div class="code-name">#iiry-a-fenzu110</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu4"></use>
+                </svg>
+                <div class="name">分组 4</div>
+                <div class="code-name">#iiry-a-fenzu4</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu3"></use>
+                </svg>
+                <div class="name">分组 3</div>
+                <div class="code-name">#iiry-a-fenzu3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu16"></use>
+                </svg>
+                <div class="name">分组 1 (6)</div>
+                <div class="code-name">#iiry-a-fenzu16</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-CombinedShape"></use>
+                </svg>
+                <div class="name">Combined Shape</div>
+                <div class="code-name">#iiry-a-CombinedShape</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-Shape"></use>
+                </svg>
+                <div class="name">Shape</div>
+                <div class="code-name">#iiry-Shape</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-mengbanfenzu"></use>
+                </svg>
+                <div class="name">蒙版分组</div>
+                <div class="code-name">#iiry-mengbanfenzu</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-bianji-2"></use>
+                </svg>
+                <div class="name">bianji-2</div>
+                <div class="code-name">#iiry-bianji-2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-xingzhuang"></use>
+                </svg>
+                <div class="name">形状</div>
+                <div class="code-name">#iiry-xingzhuang</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-lujing11"></use>
+                </svg>
+                <div class="name">路径 1 (1)</div>
+                <div class="code-name">#iiry-a-lujing11</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-account_circle1"></use>
+                </svg>
+                <div class="name">account_circle (1)</div>
+                <div class="code-name">#iiry-a-account_circle1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-bingji"></use>
+                </svg>
+                <div class="name">并集</div>
+                <div class="code-name">#iiry-bingji</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu33"></use>
+                </svg>
+                <div class="name">分组 3 (3)</div>
+                <div class="code-name">#iiry-a-fenzu33</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-lujing1"></use>
+                </svg>
+                <div class="name">路径 1</div>
+                <div class="code-name">#iiry-a-lujing1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-lujingbeifen"></use>
+                </svg>
+                <div class="name">路径备份</div>
+                <div class="code-name">#iiry-lujingbeifen</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu17"></use>
+                </svg>
+                <div class="name">分组 1 (7)</div>
+                <div class="code-name">#iiry-a-fenzu17</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu12"></use>
+                </svg>
+                <div class="name">分组 1 (2)</div>
+                <div class="code-name">#iiry-a-fenzu12</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-gouwuche-3copy"></use>
+                </svg>
+                <div class="name">gouwuche-3 copy</div>
+                <div class="code-name">#iiry-a-gouwuche-3copy</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu111"></use>
+                </svg>
+                <div class="name">分组 1 (11)</div>
+                <div class="code-name">#iiry-a-fenzu111</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-ShapeCopy20beifen2"></use>
+                </svg>
+                <div class="name">Shape Copy 20备份 2</div>
+                <div class="code-name">#iiry-a-ShapeCopy20beifen2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu21"></use>
+                </svg>
+                <div class="name">分组 2 (1)</div>
+                <div class="code-name">#iiry-a-fenzu21</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-account_circle"></use>
+                </svg>
+                <div class="name">account_circle</div>
+                <div class="code-name">#iiry-account_circle</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-sousuotubiao"></use>
+                </svg>
+                <div class="name">搜索图标</div>
+                <div class="code-name">#iiry-sousuotubiao</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-bianzu8fuzhi"></use>
+                </svg>
+                <div class="name">编组 8复制</div>
+                <div class="code-name">#iiry-a-bianzu8fuzhi</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-fenxiang"></use>
+                </svg>
+                <div class="name">fenxiang</div>
+                <div class="code-name">#iiry-fenxiang</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iiry-a-fenzu131"></use>
+                </svg>
+                <div class="name">分组 13</div>
+                <div class="code-name">#iiry-a-fenzu131</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

+ 243 - 0
src/components/IconText/iconfont.css

@@ -0,0 +1,243 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 3695491 */
+  src: url('iconfont.woff2?t=1665726138405') format('woff2'),
+       url('iconfont.woff?t=1665726138405') format('woff'),
+       url('iconfont.ttf?t=1665726138405') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.iiry-a-fenzu141:before {
+  content: "\e76b";
+}
+
+.iiry-a-fenzu6:before {
+  content: "\e76c";
+}
+
+.iiry-a-fenzu5:before {
+  content: "\e76d";
+}
+
+.iiry-a-fenzu32:before {
+  content: "\e76e";
+}
+
+.iiry-a-Shape1:before {
+  content: "\e736";
+}
+
+.iiry-a-fenzu19:before {
+  content: "\e737";
+}
+
+.iiry-a-fenzu8:before {
+  content: "\e738";
+}
+
+.iiry-a-fenzu14:before {
+  content: "\e739";
+}
+
+.iiry-a-fenzu52:before {
+  content: "\e73a";
+}
+
+.iiry-a-bianzu3:before {
+  content: "\e73b";
+}
+
+.iiry-a-fenzu2:before {
+  content: "\e73c";
+}
+
+.iiry-a-fenzu51:before {
+  content: "\e73d";
+}
+
+.iiry-a-xingzhuang2:before {
+  content: "\e73e";
+}
+
+.iiry-a-fenzu7:before {
+  content: "\e73f";
+}
+
+.iiry-lajitongshanchu:before {
+  content: "\e740";
+}
+
+.iiry-a-shopping_cart1:before {
+  content: "\e741";
+}
+
+.iiry-a-fenzu31:before {
+  content: "\e742";
+}
+
+.iiry-a-xingzhuang3:before {
+  content: "\e743";
+}
+
+.iiry-weizhi:before {
+  content: "\e744";
+}
+
+.iiry-a-fenzu112:before {
+  content: "\e745";
+}
+
+.iiry-a-xingzhuang1:before {
+  content: "\e746";
+}
+
+.iiry-a-fenzu15:before {
+  content: "\e747";
+}
+
+.iiry-a-fenzu1:before {
+  content: "\e748";
+}
+
+.iiry-b-dyjlr:before {
+  content: "\e749";
+}
+
+.iiry-a-fenzu11:before {
+  content: "\e74a";
+}
+
+.iiry-a-fenzu18:before {
+  content: "\e74b";
+}
+
+.iiry-Vector:before {
+  content: "\e74c";
+}
+
+.iiry-a-fenzu13:before {
+  content: "\e74d";
+}
+
+.iiry-a-BackChevron:before {
+  content: "\e74e";
+}
+
+.iiry-a-bianzu2:before {
+  content: "\e74f";
+}
+
+.iiry-shopping_cart:before {
+  content: "\e750";
+}
+
+.iiry-a-fenzu110:before {
+  content: "\e751";
+}
+
+.iiry-a-fenzu4:before {
+  content: "\e752";
+}
+
+.iiry-a-fenzu3:before {
+  content: "\e753";
+}
+
+.iiry-a-fenzu16:before {
+  content: "\e754";
+}
+
+.iiry-a-CombinedShape:before {
+  content: "\e755";
+}
+
+.iiry-Shape:before {
+  content: "\e756";
+}
+
+.iiry-mengbanfenzu:before {
+  content: "\e757";
+}
+
+.iiry-bianji-2:before {
+  content: "\e758";
+}
+
+.iiry-xingzhuang:before {
+  content: "\e759";
+}
+
+.iiry-a-lujing11:before {
+  content: "\e75a";
+}
+
+.iiry-a-account_circle1:before {
+  content: "\e75b";
+}
+
+.iiry-bingji:before {
+  content: "\e75c";
+}
+
+.iiry-a-fenzu33:before {
+  content: "\e75d";
+}
+
+.iiry-a-lujing1:before {
+  content: "\e75e";
+}
+
+.iiry-lujingbeifen:before {
+  content: "\e75f";
+}
+
+.iiry-a-fenzu17:before {
+  content: "\e760";
+}
+
+.iiry-a-fenzu12:before {
+  content: "\e761";
+}
+
+.iiry-a-gouwuche-3copy:before {
+  content: "\e762";
+}
+
+.iiry-a-fenzu111:before {
+  content: "\e763";
+}
+
+.iiry-a-ShapeCopy20beifen2:before {
+  content: "\e764";
+}
+
+.iiry-a-fenzu21:before {
+  content: "\e765";
+}
+
+.iiry-account_circle:before {
+  content: "\e766";
+}
+
+.iiry-sousuotubiao:before {
+  content: "\e767";
+}
+
+.iiry-a-bianzu8fuzhi:before {
+  content: "\e768";
+}
+
+.iiry-fenxiang:before {
+  content: "\e769";
+}
+
+.iiry-a-fenzu131:before {
+  content: "\e76a";
+}
+

File diff suppressed because it is too large
+ 0 - 0
src/components/IconText/iconfont.js


+ 408 - 0
src/components/IconText/iconfont.json

@@ -0,0 +1,408 @@
+{
+  "id": "3695491",
+  "name": "爱润颜5.0",
+  "font_family": "iconfont",
+  "css_prefix_text": "iiry-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "32297739",
+      "name": "分组 14",
+      "font_class": "a-fenzu141",
+      "unicode": "e76b",
+      "unicode_decimal": 59243
+    },
+    {
+      "icon_id": "32297740",
+      "name": "分组 6",
+      "font_class": "a-fenzu6",
+      "unicode": "e76c",
+      "unicode_decimal": 59244
+    },
+    {
+      "icon_id": "32297741",
+      "name": "分组 5",
+      "font_class": "a-fenzu5",
+      "unicode": "e76d",
+      "unicode_decimal": 59245
+    },
+    {
+      "icon_id": "32297742",
+      "name": "分组 3 (2)",
+      "font_class": "a-fenzu32",
+      "unicode": "e76e",
+      "unicode_decimal": 59246
+    },
+    {
+      "icon_id": "32297514",
+      "name": "Shape (1)",
+      "font_class": "a-Shape1",
+      "unicode": "e736",
+      "unicode_decimal": 59190
+    },
+    {
+      "icon_id": "32297515",
+      "name": "分组 1 (9)",
+      "font_class": "a-fenzu19",
+      "unicode": "e737",
+      "unicode_decimal": 59191
+    },
+    {
+      "icon_id": "32297516",
+      "name": "分组 8",
+      "font_class": "a-fenzu8",
+      "unicode": "e738",
+      "unicode_decimal": 59192
+    },
+    {
+      "icon_id": "32297517",
+      "name": "分组 1 (4)",
+      "font_class": "a-fenzu14",
+      "unicode": "e739",
+      "unicode_decimal": 59193
+    },
+    {
+      "icon_id": "32297518",
+      "name": "分组 5 (2)",
+      "font_class": "a-fenzu52",
+      "unicode": "e73a",
+      "unicode_decimal": 59194
+    },
+    {
+      "icon_id": "32297519",
+      "name": "编组 3",
+      "font_class": "a-bianzu3",
+      "unicode": "e73b",
+      "unicode_decimal": 59195
+    },
+    {
+      "icon_id": "32297520",
+      "name": "分组 2",
+      "font_class": "a-fenzu2",
+      "unicode": "e73c",
+      "unicode_decimal": 59196
+    },
+    {
+      "icon_id": "32297521",
+      "name": "分组 5 (1)",
+      "font_class": "a-fenzu51",
+      "unicode": "e73d",
+      "unicode_decimal": 59197
+    },
+    {
+      "icon_id": "32297522",
+      "name": "形状 (2)",
+      "font_class": "a-xingzhuang2",
+      "unicode": "e73e",
+      "unicode_decimal": 59198
+    },
+    {
+      "icon_id": "32297523",
+      "name": "分组 7",
+      "font_class": "a-fenzu7",
+      "unicode": "e73f",
+      "unicode_decimal": 59199
+    },
+    {
+      "icon_id": "32297524",
+      "name": "lajitongshanchu",
+      "font_class": "lajitongshanchu",
+      "unicode": "e740",
+      "unicode_decimal": 59200
+    },
+    {
+      "icon_id": "32297525",
+      "name": "shopping_cart (1)",
+      "font_class": "a-shopping_cart1",
+      "unicode": "e741",
+      "unicode_decimal": 59201
+    },
+    {
+      "icon_id": "32297526",
+      "name": "分组 3 (1)",
+      "font_class": "a-fenzu31",
+      "unicode": "e742",
+      "unicode_decimal": 59202
+    },
+    {
+      "icon_id": "32297527",
+      "name": "形状 (3)",
+      "font_class": "a-xingzhuang3",
+      "unicode": "e743",
+      "unicode_decimal": 59203
+    },
+    {
+      "icon_id": "32297528",
+      "name": "位置",
+      "font_class": "weizhi",
+      "unicode": "e744",
+      "unicode_decimal": 59204
+    },
+    {
+      "icon_id": "32297529",
+      "name": "分组 1 (12)",
+      "font_class": "a-fenzu112",
+      "unicode": "e745",
+      "unicode_decimal": 59205
+    },
+    {
+      "icon_id": "32297530",
+      "name": "形状 (1)",
+      "font_class": "a-xingzhuang1",
+      "unicode": "e746",
+      "unicode_decimal": 59206
+    },
+    {
+      "icon_id": "32297531",
+      "name": "分组 1 (5)",
+      "font_class": "a-fenzu15",
+      "unicode": "e747",
+      "unicode_decimal": 59207
+    },
+    {
+      "icon_id": "32297532",
+      "name": "分组 1",
+      "font_class": "a-fenzu1",
+      "unicode": "e748",
+      "unicode_decimal": 59208
+    },
+    {
+      "icon_id": "32297533",
+      "name": "b-dyjlr",
+      "font_class": "b-dyjlr",
+      "unicode": "e749",
+      "unicode_decimal": 59209
+    },
+    {
+      "icon_id": "32297534",
+      "name": "分组 1 (1)",
+      "font_class": "a-fenzu11",
+      "unicode": "e74a",
+      "unicode_decimal": 59210
+    },
+    {
+      "icon_id": "32297535",
+      "name": "分组 1 (8)",
+      "font_class": "a-fenzu18",
+      "unicode": "e74b",
+      "unicode_decimal": 59211
+    },
+    {
+      "icon_id": "32297536",
+      "name": "Vector",
+      "font_class": "Vector",
+      "unicode": "e74c",
+      "unicode_decimal": 59212
+    },
+    {
+      "icon_id": "32297537",
+      "name": "分组 1 (3)",
+      "font_class": "a-fenzu13",
+      "unicode": "e74d",
+      "unicode_decimal": 59213
+    },
+    {
+      "icon_id": "32297538",
+      "name": "Back Chevron",
+      "font_class": "a-BackChevron",
+      "unicode": "e74e",
+      "unicode_decimal": 59214
+    },
+    {
+      "icon_id": "32297539",
+      "name": "编组 2",
+      "font_class": "a-bianzu2",
+      "unicode": "e74f",
+      "unicode_decimal": 59215
+    },
+    {
+      "icon_id": "32297540",
+      "name": "shopping_cart",
+      "font_class": "shopping_cart",
+      "unicode": "e750",
+      "unicode_decimal": 59216
+    },
+    {
+      "icon_id": "32297541",
+      "name": "分组 1 (10)",
+      "font_class": "a-fenzu110",
+      "unicode": "e751",
+      "unicode_decimal": 59217
+    },
+    {
+      "icon_id": "32297542",
+      "name": "分组 4",
+      "font_class": "a-fenzu4",
+      "unicode": "e752",
+      "unicode_decimal": 59218
+    },
+    {
+      "icon_id": "32297543",
+      "name": "分组 3",
+      "font_class": "a-fenzu3",
+      "unicode": "e753",
+      "unicode_decimal": 59219
+    },
+    {
+      "icon_id": "32297544",
+      "name": "分组 1 (6)",
+      "font_class": "a-fenzu16",
+      "unicode": "e754",
+      "unicode_decimal": 59220
+    },
+    {
+      "icon_id": "32297545",
+      "name": "Combined Shape",
+      "font_class": "a-CombinedShape",
+      "unicode": "e755",
+      "unicode_decimal": 59221
+    },
+    {
+      "icon_id": "32297546",
+      "name": "Shape",
+      "font_class": "Shape",
+      "unicode": "e756",
+      "unicode_decimal": 59222
+    },
+    {
+      "icon_id": "32297547",
+      "name": "蒙版分组",
+      "font_class": "mengbanfenzu",
+      "unicode": "e757",
+      "unicode_decimal": 59223
+    },
+    {
+      "icon_id": "32297548",
+      "name": "bianji-2",
+      "font_class": "bianji-2",
+      "unicode": "e758",
+      "unicode_decimal": 59224
+    },
+    {
+      "icon_id": "32297549",
+      "name": "形状",
+      "font_class": "xingzhuang",
+      "unicode": "e759",
+      "unicode_decimal": 59225
+    },
+    {
+      "icon_id": "32297550",
+      "name": "路径 1 (1)",
+      "font_class": "a-lujing11",
+      "unicode": "e75a",
+      "unicode_decimal": 59226
+    },
+    {
+      "icon_id": "32297551",
+      "name": "account_circle (1)",
+      "font_class": "a-account_circle1",
+      "unicode": "e75b",
+      "unicode_decimal": 59227
+    },
+    {
+      "icon_id": "32297552",
+      "name": "并集",
+      "font_class": "bingji",
+      "unicode": "e75c",
+      "unicode_decimal": 59228
+    },
+    {
+      "icon_id": "32297553",
+      "name": "分组 3 (3)",
+      "font_class": "a-fenzu33",
+      "unicode": "e75d",
+      "unicode_decimal": 59229
+    },
+    {
+      "icon_id": "32297554",
+      "name": "路径 1",
+      "font_class": "a-lujing1",
+      "unicode": "e75e",
+      "unicode_decimal": 59230
+    },
+    {
+      "icon_id": "32297555",
+      "name": "路径备份",
+      "font_class": "lujingbeifen",
+      "unicode": "e75f",
+      "unicode_decimal": 59231
+    },
+    {
+      "icon_id": "32297556",
+      "name": "分组 1 (7)",
+      "font_class": "a-fenzu17",
+      "unicode": "e760",
+      "unicode_decimal": 59232
+    },
+    {
+      "icon_id": "32297557",
+      "name": "分组 1 (2)",
+      "font_class": "a-fenzu12",
+      "unicode": "e761",
+      "unicode_decimal": 59233
+    },
+    {
+      "icon_id": "32297558",
+      "name": "gouwuche-3 copy",
+      "font_class": "a-gouwuche-3copy",
+      "unicode": "e762",
+      "unicode_decimal": 59234
+    },
+    {
+      "icon_id": "32297559",
+      "name": "分组 1 (11)",
+      "font_class": "a-fenzu111",
+      "unicode": "e763",
+      "unicode_decimal": 59235
+    },
+    {
+      "icon_id": "32297560",
+      "name": "Shape Copy 20备份 2",
+      "font_class": "a-ShapeCopy20beifen2",
+      "unicode": "e764",
+      "unicode_decimal": 59236
+    },
+    {
+      "icon_id": "32297561",
+      "name": "分组 2 (1)",
+      "font_class": "a-fenzu21",
+      "unicode": "e765",
+      "unicode_decimal": 59237
+    },
+    {
+      "icon_id": "32297562",
+      "name": "account_circle",
+      "font_class": "account_circle",
+      "unicode": "e766",
+      "unicode_decimal": 59238
+    },
+    {
+      "icon_id": "32297563",
+      "name": "搜索图标",
+      "font_class": "sousuotubiao",
+      "unicode": "e767",
+      "unicode_decimal": 59239
+    },
+    {
+      "icon_id": "32297564",
+      "name": "编组 8复制",
+      "font_class": "a-bianzu8fuzhi",
+      "unicode": "e768",
+      "unicode_decimal": 59240
+    },
+    {
+      "icon_id": "32297565",
+      "name": "fenxiang",
+      "font_class": "fenxiang",
+      "unicode": "e769",
+      "unicode_decimal": 59241
+    },
+    {
+      "icon_id": "32297566",
+      "name": "分组 13",
+      "font_class": "a-fenzu131",
+      "unicode": "e76a",
+      "unicode_decimal": 59242
+    }
+  ]
+}

BIN
src/components/IconText/iconfont.ttf


BIN
src/components/IconText/iconfont.woff


BIN
src/components/IconText/iconfont.woff2


+ 192 - 0
src/components/ImgUpload/ImgUpload.vue

@@ -0,0 +1,192 @@
+<template>
+	<view class="img-container">
+		<view class="wrapper-box" v-if="pic">
+			<view class="wrapper" :style="{ width: width + 'vw', height: height + 'vw' }">
+				<image class="image" mode="aspectFill" :src="pic" @click="preview(pic)" @load="hideLoading" />
+				<text class="close-icon" @click="deletePic()">&#xe88a;</text>
+			</view>
+		</view>
+		<view class="wrapper-box" v-else>
+			<view class="add" :style="{ width: width + 'vw', height: height + 'vw' }" @click="addImg">
+				<IconText :code="`\ue76f`" :color="addColor" size="32"></IconText>
+				<view class="tip" v-if="tip">{{tip}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Watch
+	} from 'vue-property-decorator';
+	@Component({})
+	export default class MulImgUlpload extends Vue {
+		@Prop({
+			default: ""
+		})
+		imgs ? : any;
+		@Prop({
+			default: ""
+		})
+		tip ? : any;
+		@Prop({
+			default: 26
+		})
+		width ? : number;
+		@Prop({
+			default: 26
+		})
+		height ? : number;
+		@Prop({
+			default: '#9c3d92'
+		})
+		addColor ? : string;
+		@Prop({
+			default: false
+		})
+		disabled ? : boolean;
+		@Prop({
+			default: "点击上传图片"
+		})
+		label ? : any;
+		pic: any = "";
+		@Emit('update')
+		changeImg(): any {
+			return this.pic;
+		}
+		@Emit('cancelUpdate')
+		cancelUpdate(): any {}
+		@Watch('imgs', {
+			deep: true,
+			immediate: true,
+		})
+		imgsChange(val: any) {
+			if (val) {
+				this.pic = val;
+			} else {
+				this.pic = '';
+			}
+		}
+		addImg(): void {
+			// if (this.disabled) return;
+
+			// 选择图库图片
+			const that = this;
+			uni.chooseImage({
+				count: 1,
+				success: (res: any) => {
+					const tempFilePaths: any = res.tempFilePaths;
+					uni.showLoading({
+						title: '上传中...'
+					});
+					tempFilePaths.forEach((item: any, index: any) => {
+						that.$http
+							.upPic({
+								filePath: item
+							})
+							.then((res: any) => {
+								uni.hideLoading();
+								this.pic = res;
+								that.changeImg();
+							})
+							.catch((err: any) => {
+								uni.hideLoading();
+								console.log(err);
+							});
+					});
+				},
+				fail: () => {
+					this.cancelUpdate();
+				}
+			});
+		}
+		deletePic(): void {
+			// console.log(3333, index);
+			if (this.disabled) return;
+			this.pic = '';
+			this.changeImg();
+		}
+		preview(url: string): void {
+			uni.previewImage({
+				current: url, // 当前显示图片的http链接
+				urls: [url] // 需要预览的图片http链接列表
+			});
+		}
+		hideLoading(): void {
+			uni.hideLoading();
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.img-container {
+			width: 100%;
+			display: flex;
+			align-content: flex-start;
+			flex-wrap: wrap;
+			background: white;
+			// padding-top: 10px;
+	
+			.wrapper-box {
+				width: 1/3 * 100%;
+				margin-bottom: vw(12);
+	
+				&:nth-of-type(3n+2) {
+					@include flex-x(center);
+				}
+	
+				&:nth-of-type(3n) {
+					@include flex-x(flex-end);
+				}
+				.tip{
+					margin-top: vw(10);
+				}
+			}
+	
+			.wrapper {
+				position: relative;
+	
+				.image {
+					width: 100%;
+					height: 100%;
+					border-radius: 3px;
+				}
+	
+				.close-icon {
+					position: absolute;
+					width: vw(40);
+					height: vw(40);
+					top: 0;
+					left: 0;
+					right: 0;
+					bottom: 0;
+					margin: auto;
+					@include icon(40, rgba(0, 0, 0, 0.5));
+				}
+			}
+	
+			.add {
+				// width: vw(100);
+				// height: vw(100);
+				@include flex-y(center);
+				color: #999;
+				background: #F2F2F2;
+				border: 1px solid #f5f5f5;
+				border-radius: vw(5);
+				box-sizing: border-box;
+	
+				.default-icon {
+					@include icon(60, $btn-color);
+				}
+	
+				.tips {
+					@include word-vw(12, #cccccc);
+				}
+			}
+		}
+	</style>
+	

+ 245 - 0
src/components/LiveItem/LiveItem.vue

@@ -0,0 +1,245 @@
+<template>
+	<view class="good-item" :class="{'good-item2': sortType === 2}" v-if="item"
+		:style="{background: bg,marginBottom: (marginBottom / 3.75) + 'vw'}" @click="handleDetail">
+		<view class="top">
+			<!-- <image :src="item.headUrl" class="img" mode="aspectFill"></image> -->
+			<channel-live class="img" :feed-id="item.feedId" finder-user-name="sphki2DWoePKvPI"></channel-live>
+		</view>
+		<view class="bottom">
+			<view class="good-name">
+				{{item.description}}
+			</view>
+			<!-- <view class="tip">{{item.tagline}}</view> -->
+			<view class="pre-price">
+				<image :src="item.headUrl" class="img" mode="aspectFill"></image><text>{{item.nickname}}</text>
+			</view>
+			<view class="price-box">
+				<view class="status" :style="{background: statusMap[item.status].color}">{{statusMap[item.status].name}}
+				</view>
+				<!-- {{item.created}} -->
+			</view>
+		</view>
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Vue
+	} from 'vue-property-decorator';
+	@Component({
+		filters: {
+			moneyFormat(val : any) {
+				if (!+val) return '0.00';
+				return (+val).toFixed(2);
+			}
+		}
+	})
+	export default class Navbar extends Vue {
+		@Prop({
+			default: {}
+		})
+		private item! : any; // 
+
+		@Prop({
+			default: '#fff'
+		})
+		private bg ?: string; // 
+
+		@Prop({
+			default: 10
+		})
+		private marginBottom ?: number; // 
+
+		@Prop({
+			default: 1
+		})
+		private sortType ?: number; // 
+
+		statusMap : any = {
+			// 0: {
+			// 	name: '未开始',
+			// 	color: '#D3325C'
+			// },
+			// 1: {
+			// 	name: '未开始',
+			// 	color: '#D3325C'
+			// },
+			2: {
+				name: '直播中',
+				color: '#40B664'
+			},
+			3: {
+				name: '直播结束',
+				color: '#61A1F0'
+			}
+		}
+
+		handleDetail() {
+			// this.$Router.push({
+			// 	path: '/packages/goods/good-detail',
+			// 	query: {
+			// 		// id: this.item.id,
+			// 		gid: this.item.gid
+			// 	}
+			// });
+			wx.openChannelsLive({
+				finderUserName: 'sphki2DWoePKvPI',
+				feedId: this.item.feedId,
+				nonceId: this.item.nonceId
+			})
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.good-item {
+		// width: 100%;
+		@include flex-y(flex-start);
+		border-radius: vw(10);
+		box-sizing: border-box;
+		overflow: hidden;
+
+		.top {
+			.img {
+				width: vw(200);
+				height: vw(200);
+				display: block;
+				flex-shrink: 0;
+			}
+		}
+
+		.bottom {
+			padding: vw(8);
+			width: 100%;
+			box-sizing: border-box;
+
+			.good-name {
+				width: vw(156);
+				@include ellipsis();
+				@include word-vw(14, #333);
+				@include flex-x(flex-start);
+
+				// font-weight: 600;
+				.genre {
+					width: vw(56);
+					height: vw(18);
+					@include word-vw(10, #fff);
+					@include flex-x(center);
+					background: #F75E24;
+					border-radius: vw(3);
+					margin-right: vw(3);
+					flex-shrink: 0;
+				}
+			}
+
+			.tip {
+				@include word-vw(12, #999);
+			}
+
+			.price-box {
+				width: 100%;
+				@include flex-x(flex-start);
+				margin-top: vw(8);
+
+				.price {
+					@include word-vw(14, #E33C64);
+					font-weight: 600;
+
+					text {
+						@include word-vw(12, #fff);
+					}
+				}
+
+				.good-car {
+					flex: 1;
+					@include flex-x(flex-end);
+				}
+			}
+
+			.pre-price {
+				@include word-vw(10, #999);
+				margin-left: vw(5);
+
+				text {
+					// text-decoration: line-through;
+				}
+			}
+		}
+	}
+
+	.good-item2 {
+		@include flex-x();
+		width: vw(355);
+		padding: vw(10);
+		border-radius: vw(10);
+
+		// width: 100%;
+		.top {
+			width: vw(150);
+
+			.img {
+				width: 100%;
+				height: vw(200);
+				overflow: hidden;
+				display: block;
+				border-radius: vw(5);
+			}
+		}
+
+		.bottom {
+			height: 100%;
+			flex: 1;
+			// height: vw(156);
+			min-height: vw(112);
+			padding: vw(0) vw(12);
+			box-sizing: border-box;
+			@include flex-y();
+			height: vw(180);
+
+			.good-name {
+				flex: 1;
+				width: 100%;
+				box-sizing: border-box;
+				white-space: pre-wrap;
+				@include word-vw(18, #333);
+				font-weight: 500;
+				margin-top: vw(5);
+				height: vw(40);
+				@include flex-y(flex-start, flex-start);
+			}
+
+			.pre-price {
+				width: 100%;
+				margin-bottom: vw(4);
+				margin-left: 0;
+				font-size: vw(14);
+				margin-top: vw(8);
+				@include flex-x(flex-start);
+
+				.img {
+					width: vw(24);
+					height: vw(24);
+					display: block;
+					border-radius: vw(12);
+					margin-right: vw(8);
+				}
+			}
+
+			.price-box {
+				@include flex-x();
+
+				.status {
+					height: vw(22);
+					border-radius: vw(11);
+					@include word-vw(14, #fff);
+					font-weight: 500;
+					background: #D3325C;
+					padding: 0 vw(12);
+					@include flex-x(center);
+				}
+			}
+		}
+	}
+</style>

+ 216 - 0
src/components/LiveShare/LiveShare.vue

@@ -0,0 +1,216 @@
+<template>
+	<view class="share-container">
+		<uni-popup ref="popup" type="center">
+			<view class="wrapper" v-if="popShow">
+				<canvas canvas-id="shareCanvas" class="canvas" style="width: 250px;height:367px;"></canvas>
+				<view class="bottom">
+					<!-- <button class="bottom-btn" open-type="share">
+						<image :src="static + 'wechat.png'"></image>
+						<view class="text">分享好友</view>
+					</button> -->
+					<view class="bottom-btn" @click="saveImageToPhotos('shareCanvas')">
+						<image :src="static + 'download.png'"></image>
+						<view class="text">保存图片</view>
+					</view>
+				</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script lang="ts">
+	// @ts-nocheck
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Mixins
+	} from 'vue-property-decorator';
+	import {
+		types
+	} from '@/common/store';
+	import {
+		OSS_STATIC
+	} from '@/common/constants';
+	import canvasMixin from '@/common/mixins/canvasMixin.ts';
+	import {
+		namespace
+	} from 'vuex-class';
+	const canvasModule = namespace('canvas');
+	const baseModule = namespace('base');
+	@Component({})
+	export default class ShopShare extends Mixins(canvasMixin) {
+		@canvasModule.Getter('_canvasData') _canvasData: any;
+		@baseModule.Getter('_userInfo') _userInfo: any;
+		@baseModule.Getter('_goods') goodsInfo: any;
+		popShow: boolean = false;
+		static: string = OSS_STATIC;
+		
+		@Prop({
+			default: {}
+		})
+		info ? : any;
+
+		closePop(): void {
+			(this.$refs.popup as any).close();
+			this.popShow = false;
+		}
+		openPop(): void {
+			(this.$refs.popup as any).open();
+			this.popShow = true;
+			uni.showLoading({
+				title: '加载中'
+			});
+			this.$nextTick(()=> {
+				this.drawPoster();
+			})
+		}
+		mounted() {}
+		drawPoster(): void {
+			// 绘制海报
+			// 注意:page页面canvas-id获取ctx,组件需传this
+			const that = this;
+			const ctx = uni.createCanvasContext('shareCanvas', this);
+			// 绘制白色底
+			this.roundRect(ctx, 0, 0, 250, 367, '#ffffff', 8, 8, 8, 8);
+			// 绘制头像
+			// this.drawCircular(ctx, 24, 24, 13, 15, that._canvasData.avatar);
+			// this.ellipsisText(
+			// 	ctx,
+			// 	that._userInfo.nickname,
+			// 	// '爱润妍',
+			// 	200,
+			// 	43,
+			// 	13,
+			// 	'#999',
+			// 	'10px',
+			// 	14
+			// );
+			// // 绘制宣传语
+			// this.ellipsisText(
+			// 	ctx,
+			// 	'推荐给你一个好物',
+			// 	200,
+			// 	43,
+			// 	27,
+			// 	'#454545',
+			// 	'10px',
+			// 	14
+			// );
+			// this.textSet(ctx, '”', '45px', 135, 20, '#ddd');
+			// // 绘制店铺图片
+			// this.drawImgInfo(
+			// 	ctx,
+			// 	10,
+			// 	50,
+			// 	230,
+			// 	230,
+			// 	that.goodsInfo.goodImg,
+			// 	that.goodsInfo.width,
+			// 	that.goodsInfo.height
+			// );
+			// // 商品标题
+			// this.ellipsisText(
+			// 	ctx,
+			// 	that.goodsInfo.name,
+			// 	180,
+			// 	11,
+			// 	291,
+			// 	'#000',
+			// 	'14px',
+			// 	20,
+			// 	1,
+			// 	'bold '
+			// );
+			// // 商品副标题
+			// this.ellipsisText(
+			// 	ctx,
+			// 	that.goodsInfo.tagline,
+			// 	150,
+			// 	11,
+			// 	311,
+			// 	'#999',
+			// 	'10px',
+			// 	14,
+			// 	1
+			// );
+			// //  划线价
+			// let linePrice:string = '¥0.00';
+			// if (that.goodsInfo.linePrice) {
+			// 	linePrice = '¥' + Number(that.goodsInfo.linePrice).toFixed(2);
+			// }
+			// this.textSet(ctx, linePrice, '12px', 11, 375, '#999');
+			// let lineH = ctx.measureText(linePrice).width;
+			// ctx.moveTo(14, 382);
+			// ctx.lineTo(lineH + 14, 382);
+			// ctx.strokeStyle = '#999999';
+			// ctx.stroke();
+			// // 商品价格
+			// this.textSet(ctx, '¥', '12px', 11, 362, '#000', 'bold ');
+			// this.textSet(
+			// 	ctx,
+			// 	Number(that.goodsInfo.sharePrice).toFixed(2),
+			// 	'19px',
+			// 	19,
+			// 	356,
+			// 	'#000',
+			// 	'bold '
+			// );
+			// // 小程序码
+			ctx.drawImage(that.info.qr, 25, 32, 200, 200);
+			this.textCenterSet(ctx, '长按识别进入花源溪直播列表', '14px', 125, 255, '#D3325C', 180);
+			this.textCenterSet(ctx, '将该二维码分享给微信好友或', '14px', 125, 320, '#666', 180);
+			this.textCenterSet(ctx, '者保存至相册转发给好友', '14px', 125, 338, '#666', 180);
+			ctx.draw(true, () => {
+				console.log('draw,true');
+				uni.hideLoading();
+			});
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.wrapper {
+		@include flex-y();
+		width: 250px;
+	}
+
+	.canvas {
+		border-radius: vw(5);
+		overflow: hidden;
+		margin-top: vw(50);
+	}
+
+	.bottom {
+		width: 230px;
+		margin-top: vw(15);
+		@include flex-x(center);
+
+		.text {
+			@include word-vw(14, white);
+			line-height: vw(20);
+			margin-top: vw(5);
+		}
+
+		image {
+			width: vw(60);
+			height: vw(60);
+		}
+	}
+
+	button {
+		background: none;
+		line-height: 1;
+		padding: 0;
+		margin: 0;
+	}
+
+	button::after {
+		border: 0px;
+	}
+
+	.button-hover {
+		background: none;
+	}
+</style>

+ 359 - 0
src/components/MiniSpec/MiniSpec.vue

@@ -0,0 +1,359 @@
+<template>
+	<scroll-view class="mini-spec" scroll-y="true" show-scrollbar="false">
+		<view class="spec-item" v-for="(item,i) in demoData" :key="i">
+			<view class="spec-title">{{ item }}</view>
+			<!--多个选项-->
+			<view class="spec-list">
+				<view class="spec-value" v-for="(sku,index) in showSpec[item]" :key="index" @tap="chooseSpec(item, sku)"
+					:class="[{active:selectedArr[item] === sku}]">
+					<!-- wx:class="{{ { theme_main_bk:selectedArr[item] === sku , no:filters.noActive(notSelectable,sku)} }}" -->
+					{{ sku }}
+				</view>
+			</view>
+		</view>
+	</scroll-view>
+</template>
+<script lang='ts'>
+	import {
+		Component,
+		Prop,
+		Watch,
+		Emit,
+		Vue
+	} from 'vue-property-decorator';
+	// import * as utf8 from "utf8";
+	@Component({})
+	export default class MiniSpec extends Vue {
+		proContent: any = null;
+		showSpec: any = {}; // 用于展示的规格选项
+		reSku: Array < any >= []; // 重组后的sku-->[{path: "三人份-BT辣-羊肉-炒",sku: "000UNLI4"}]
+		selectedArr: Array < any >= []; // 所有选中的规格与key的组合
+		notSelectable: Array < any >= [];
+		allPath: any = {};
+		keys: string = ""; // 所有可选属性行
+		selectedCache: Array < any >= []; // 已选中的缓存
+		spliter: string = "-"; // 分隔符
+		curtSelect: string = ""; // 当前选中的规格
+
+		@Prop({
+			default: {}
+		}) specData: any;
+		@Prop({
+			default: false
+		}) sellOut!: boolean;
+
+		get demoData() {
+			return Object.keys(this.showSpec) || [];
+		}
+
+		@Watch('specData', {
+			deep: true,
+			immediate: true,
+		})
+		specDataChange(val: any) {
+			this.proContent = val;
+			this.proContent.skuList.length && this.initData();
+		}
+
+
+		initData() {
+			// 售罄不执行
+			if (this.sellOut) {
+				return;
+			}
+			//proContent未准备好 不执行
+			if (!this.proContent) return;
+			// 单规格未设置'默认'规格时,不执行
+			if (!this.proContent.skuList[0].attrs) return;
+			// 暂时不过滤库存为0 的商品
+			// this.filterNullSku();
+
+			// 过滤 keys 可选的规格名称 ['款式','口味']
+			this.keys = this.filterKeys(this.proContent);
+			// console.log('this.keys------>', this.keys);
+
+			// 展示给用户的规格选项
+			this.showSpec = this.getshowSpec(this.proContent.skuList);
+			// console.log("this.showSpec------>", this.showSpec);
+
+			// this.reSku ==》[{path:'大-不辣',sku:111},{path:'大-辣',sku:111}]
+			this.reSku = this.combineAttr(this.proContent.skuList);
+			// console.log('this.reSku------>', this.reSku)
+
+			this.buildResult(this.reSku);
+
+			// 只有一个sku时默认选中所有选项
+			const oneSku = this.proContent.skuList.length === 1;
+			// 开局选中
+			let skuItem = this.proContent.skuList;
+			console.log('选中的规格', this.selectedArr)
+			for (let k in this.selectedArr) {
+				skuItem[0].attrs.map((sku: any) => {
+					if (sku.keyName == k) {
+						this.selectedArr[k] = sku.value;
+					}
+				});
+			}
+			this.updateStatus(this.getSelectedItem());
+			this.getChoose()
+		}
+
+		filterKeys(proContent: any): any {
+			// let keys =[]
+			// proContent.skuList.map((item,index)=>{
+			//      item.attrs.map(res=> keys.push(res.keyName))
+			// })
+			// keys = [...new Set(keys)]
+			//  return keys
+			// console.log("proContent", proContent);
+			let keys: Array < any >= [];
+			(proContent.skuList[0] as any).attrs.map((res: any) => keys.push(res.keyName));
+			keys = [...new Set(keys)];
+			return keys;
+		}
+
+		// 属性点击事件
+		chooseSpec(skey: any, sval: any) {
+			// sval = utf8.encode(sval);
+			// skey->选中的规格key,sval->选中的规格值
+			// this.curtSelect = sval;
+			// console.log(!this.notSelectable.includes(sval))
+			if (!this.notSelectable.includes(sval)) {
+				if (this.selectedArr[skey] === sval) {
+					// this.selectedArr[skey] = "";
+					this.$set(this.selectedArr, skey, '')
+				} else {
+					// this.selectedArr[skey] = sval;
+					this.$set(this.selectedArr, skey, sval)
+				}
+				this.updateStatus(this.getSelectedItem());
+				// this.$emit('getChoose', this.selectedArr);
+				this.getChoose()
+			}
+		}
+
+
+		// // 将sku stock为0的sku过滤掉  一个sku的不过滤了
+		// filterNullSku() {
+		// 	if (this.proContent && this.proContent.skuList.length > 1) {
+		// 		let sku = {};
+		// 		sku = this.proContent.skuList.filter((item) => item.stock > 0);
+		// 		this.proContent.skuList = sku;
+		// 	}
+		// }
+
+		// 将商品数据中的 sku 用 key 过滤出所有可选的商品规格
+		getshowSpec(skuList: any) {
+			let keys = this.keys;
+			let jsons: any = {};
+			let select: any = {};
+			for (let key_val of keys) {
+				jsons[key_val] = [];
+				select[key_val] = "";
+
+				for (let j = 0; j < skuList.length; j++) {
+					for (let i = 0; i < keys.length; i++) {
+						if (
+							skuList[j].attrs[i].keyName &&
+							skuList[j].attrs[i].keyName === key_val
+						) {
+							jsons[key_val].push(skuList[j].attrs[i].value);
+						}
+					}
+				}
+			}
+
+			for (let i in jsons) {
+				jsons[i] = [...new Set(jsons[i])];
+			}
+			this.selectedArr = select; // 后面储存已选属性要用到 {颜色:'',尺寸: ''...}
+			// console.log('this.selectedArr------>', this.selectedArr);
+
+			return jsons;
+		}
+
+		// 计算组合数据
+		combineAttr(skuList: any) {
+			let allKeys: Array < any >= [];
+			skuList.map((res: any) => {
+				let values: Array < any > = [];
+				res.attrs.forEach((key: any) => {
+					values.push(key.value);
+				});
+				allKeys.push({
+					path: values.join(this.spliter),
+					id: res.id,
+				});
+			});
+			return allKeys;
+		}
+
+
+
+
+		/**
+		 * 生成所有子集是否可选、库存状态 map
+		 *  items =》 [{path:'大-不辣',sku:111},{path:'大-辣',sku:111}]
+		 *  allKeys =>["大-辣", "大-不辣", "中-不辣", "中-辣", "小-辣", "小-不辣"]
+		 *  return  =>{ 不辣:{skus:[123,12323]}}
+		 */
+		buildResult(items: any) {
+			this.allPath = {};
+			let allKeys = items.map((res: any) => res.path);
+			for (let i = 0; i < allKeys.length; i++) {
+				let sku: string = items[i].id;
+				let values: Array < any > = allKeys[i].split(this.spliter);
+				let allSets = this.powerset(values);
+				// 每个组合的子集
+				// 清空allpath,zcj
+				// this.allPath = {};
+				for (let j = 0; j < allSets.length; j++) {
+					let set = allSets[j];
+					let key = set.join(this.spliter);
+					console.log(key)
+					if (this.allPath[key]) {
+						this.allPath[key].skus.push(sku);
+					} else {
+						this.allPath[key] = {
+							skus: [sku],
+						};
+					}
+				}
+			}
+			console.log('this.allPath------>', this.allPath);
+		}
+
+		powerset(arr: any) {
+			let ps: any = [
+				[]
+			];
+			for (let i = 0; i < arr.length; i++) {
+				for (let j = 0, len = ps.length; j < len; j++) {
+					ps.push(ps[j].concat(arr[i]));
+				}
+			}
+			return ps;
+		}
+
+		// 过滤分隔符
+		trimSpliter(str: any) {
+			// ⊙abc⊙ => abc
+			// ⊙a⊙⊙b⊙c⊙ => a⊙b⊙c
+			let reLeft = new RegExp("^" + this.spliter + "+", "g");
+			let reRight = new RegExp(this.spliter + "+$", "g");
+			let reSpliter = new RegExp(this.spliter + "+", "g");
+			return str
+				.replace(reLeft, "")
+				.replace(reRight, "")
+				.replace(reSpliter, this.spliter);
+		}
+
+		// 获取当前选中的属性 =>['大','不辣']
+		getSelectedItem() {
+			let result: any = [];
+			result = Object.values(this.selectedArr);
+			return result;
+		}
+
+
+		// 更新所有属性状态
+		updateStatus(selected: any) {
+			this.notSelectable = [];
+			for (let i = 0, len = this.keys.length; i < len; i++) {
+				let key: any = this.keys[i];
+				let data: any = this.showSpec[key];
+				// console.log('data',data);
+				let copy: any = selected.slice();
+				// console.log('copy',copy);
+				for (let j = 0; j < data.length; j++) {
+					let item: any = data[j];
+					if (selected[i] === item) continue;
+					copy[i] = item;
+					let curr = this.trimSpliter(copy.join(this.spliter));
+					if (!this.allPath[curr]) {
+						this.notSelectable.push(item);
+						// console.log("this.notSelectable------>", this.notSelectable);
+					}
+				}
+			}
+
+			if (!this.getSelectedItem().includes("")) {
+				let choSku: any = this.getSelectedItem().join(this.spliter);
+				// console.log(choSku);
+				// choSku = utf8.encode(choSku);
+				// console.log("findSku1", this.allPath[choSku]);
+				this.findSku(this.allPath[choSku].skus[0])
+			}
+		}
+
+
+
+		// emit===================================
+		@Emit('getChoose')
+		getChoose() {
+			return this.selectedArr
+		}
+
+		@Emit('findSku')
+		findSku(value: any) {
+			return value
+		}
+
+
+	}
+</script>
+
+<style lang='scss' scoped>
+	.mini-spec {
+		max-height: vw(200);
+		overflow-y: scroll;
+
+		@include hide-scrollbar() .spec-item {
+			@include word-vw(14, $gray3);
+
+			.spec-title {
+				@include word-vw(16, $gray3);
+				line-height: vw(40);
+			}
+
+			.spec-list {
+				display: flex;
+				flex-wrap: wrap;
+				margin-top: vw(6);
+
+				.spec-value {
+					min-width: vw(100);
+					max-width: vw(345);
+					@include ellipsis();
+
+					height: vw(32);
+					line-height: vw(32);
+					padding: 0 vw(10);
+					box-sizing: border-box;
+					text-align: center;
+					@include word-vw(14, $gray3);
+					background: #fff;
+					border-radius: vw(8);
+					margin-right: vw(18);
+					margin-bottom: vw(16);
+
+					&.active {
+						/* background: #fff; */
+						color: $bk-color;
+						/* background-color: $bk-color; */
+						/* border: vw(1) solid $main-color; */
+					}
+
+					&.no {
+						color: $gray9;
+						background: #EFEFEF;
+					}
+				}
+
+				.spec-value:last-child {
+					margin-right: 0;
+				}
+			}
+		}
+	}
+</style>

+ 193 - 0
src/components/MulImgUpload/MulImgUpload.vue

@@ -0,0 +1,193 @@
+<template>
+	<view class="img-container">
+		<view class="wrapper-box" v-for="(item, index) in imgList" :key="index">
+			<view class="wrapper" :style="{ width: width + 'vw', height: height + 'vw' }">
+				<image class="image" mode="aspectFill" :src="item" @click="preview(item)" @load="hideLoading" />
+				<text class="close-icon" @click="deletePic(index)">&#xe87d;</text>
+			</view>
+		</view>
+		<view class="wrapper-box">
+			<view class="add" :style="{ width: width + 'vw', height: height + 'vw' }" @click="addImg"
+				v-if="!max || imgList.length < max">
+				<!-- <text class="default-icon" :style="{ color: addColor }">&#xe71b;</text> -->
+				<IconText :code="`\ue8c0`" :color="addColor" size="20"></IconText>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Watch
+	} from 'vue-property-decorator';
+	@Component({})
+	export default class MulImgUlpload extends Vue {
+		@Prop({
+			default: []
+		})
+		imgs ? : string[];
+		@Prop({
+			default: 9
+		})
+		max ? : number;
+		@Prop({
+			default: 26
+		})
+		width ? : number;
+		@Prop({
+			default: 26
+		})
+		height ? : number;
+		@Prop({
+			default: '#9c3d92'
+		})
+		addColor ? : string;
+		@Prop({
+			default: false
+		})
+		disabled ? : boolean;
+		imgList: string[] = [];
+		@Emit('update')
+		changeImg(): string[] {
+			return this.imgList;
+		}
+		@Emit('cancelUpdate')
+		cancelUpdate(): any {}
+		@Watch('imgs', {
+			deep: true,
+			immediate: true,
+		})
+		imgsChange(val: any) {
+			if (val) {
+				this.imgList = val;
+			}
+		}
+		addImg(e: any): void {
+			// if (this.disabled) return;
+			if ((this.max as number) > 0 && this.imgList.length >= (this.max as number)) {
+				// 如果超出最大张数限制,提示
+				uni.showToast({
+					title: '至多添加' + this.max + '张',
+					duration: 2000
+				});
+				return;
+			}
+
+			// 选择图库图片
+			const that = this;
+			uni.chooseImage({
+				count: this.max,
+				success(res) {
+					const tempFilePaths: any = res.tempFilePaths;
+					uni.showLoading({
+						title: '上传中...'
+					});
+					tempFilePaths.forEach((item: any, index: any) => {
+						that.$http
+							.upPic({
+								filePath: item
+							})
+							.then((res: any) => {
+								uni.hideLoading();
+								if (!that.max || that.imgList.length < that.max) {
+									that.imgList.push(res);
+								}
+								that.changeImg();
+							})
+							.catch((err: any) => {
+								uni.hideLoading();
+								console.log(err);
+							});
+					});
+				},
+				fail: () => {
+					this.cancelUpdate();
+				}
+			});
+		}
+		deletePic(index: any): void {
+			// console.log(3333, index);
+			if (this.disabled) return;
+			this.imgList.splice(index, 1);
+			this.changeImg();
+		}
+		preview(url: string): void {
+			uni.previewImage({
+				current: url, // 当前显示图片的http链接
+				urls: [url] // 需要预览的图片http链接列表
+			});
+		}
+		hideLoading(): void {
+			uni.hideLoading();
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.img-container {
+		width: 100%;
+		display: flex;
+		align-content: flex-start;
+		flex-wrap: wrap;
+		background: white;
+		// padding-top: 10px;
+
+		.wrapper-box {
+			width: 1/3 * 100%;
+			margin-bottom: vw(12);
+
+			&:nth-of-type(3n+2) {
+				@include flex-x(center);
+			}
+
+			&:nth-of-type(3n) {
+				@include flex-x(flex-end);
+			}
+		}
+
+		.wrapper {
+			position: relative;
+
+			.image {
+				width: 100%;
+				height: 100%;
+				border-radius: 3px;
+			}
+
+			.close-icon {
+				position: absolute;
+				width: vw(40);
+				height: vw(40);
+				top: 0;
+				left: 0;
+				right: 0;
+				bottom: 0;
+				margin: auto;
+				@include icon(40, rgba(0, 0, 0, 0.5));
+			}
+		}
+
+		.add {
+			// width: vw(100);
+			// height: vw(100);
+			@include flex-y(center);
+			color: #999;
+			background: #F2F2F2;
+			border: 1px solid #f5f5f5;
+			border-radius: vw(5);
+			box-sizing: border-box;
+
+			.default-icon {
+				@include icon(60, $btn-color);
+			}
+
+			.tips {
+				@include word-vw(12, #cccccc);
+			}
+		}
+	}
+</style>

+ 173 - 0
src/components/MulVideoUpload/MulVideoUpload.vue

@@ -0,0 +1,173 @@
+<template>
+	<view class="img-container">
+		<view class="wrapper-box">
+			<view class="wrapper" v-if="videoUrl">
+				<video class="image" :controls="false" :show-center-play-btn="false" :src="videoUrl" @load="hideLoading"
+					v-if="videoUrl" />
+				<text class="close-icon" @click="deleteVideo(index)">&#xe6e8;</text>
+			</view>
+		</view>
+		<!-- <view class="wrapper-box">
+			<view class="add" :style="{ width: width + 'vw', height: height + 'vw' }" @click="addVideo"
+				v-if="!videoUrl">
+				<text class="default-icon" :style="{ color: addColor }">&#xe71b;</text>
+			</view>
+		</view> -->
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Watch
+	} from 'vue-property-decorator';
+	@Component({})
+	export default class MulVideoUlpload extends Vue {
+		@Prop({
+			default: []
+		})
+		imgs ? : string[];
+		@Prop({
+			default: 9
+		})
+		max ? : number;
+		@Prop({
+			default: 26
+		})
+		width ? : number;
+		@Prop({
+			default: 26
+		})
+		height ? : number;
+		@Prop({
+			default: '#9c3d92'
+		})
+		addColor ? : string;
+		@Prop({
+			default: false
+		})
+		disabled ? : boolean;
+		videoUrl: string = '';
+		@Emit('update')
+		changeImg(): any {
+			return this.videoUrl;
+		}
+
+		@Emit('cancelUpdate')
+		cancelUpdate(): any {}
+		@Watch('video', {
+			deep: true,
+			immediate: true,
+		})
+		videoChange(val: any) {
+			if (val) {
+				this.videoUrl = val;
+			}
+		}
+		addVideo(e: any): void {
+
+			// 选择图库图片
+			const that = this;
+			uni.chooseVideo({
+				sourceType: ['camera', 'album'],
+				success(res) {
+					const tempFilePath: any = res.tempFilePath;
+					uni.showLoading({
+						title: '上传中...'
+					});
+					that.$http
+						.upPic({
+							filePath: tempFilePath
+						})
+						.then((res: any) => {
+							uni.hideLoading();
+							that.videoUrl = res;
+							that.changeImg();
+						})
+						.catch((err: any) => {
+							uni.hideLoading();
+							console.log(err);
+						});
+				},
+				fail: () => {
+					this.cancelUpdate();
+				}
+			});
+		}
+		deleteVideo(index: any): void {
+			if (this.disabled) return;
+			this.videoUrl = "";
+			this.changeImg();
+		}
+		hideLoading(): void {
+			uni.hideLoading();
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.img-container {
+		width: 100%;
+		display: flex;
+		align-content: flex-start;
+		flex-wrap: wrap;
+		background: white;
+		padding-top: 10px;
+
+		.wrapper-box {
+			// width: 1/3 * 100%;
+			margin-bottom: vw(12);
+
+			&:nth-of-type(3n+2) {
+				@include flex-x(center);
+			}
+
+			&:nth-of-type(3n) {
+				@include flex-x(flex-end);
+			}
+		}
+
+		.wrapper {
+			position: relative;
+
+			.image {
+				width: vw(335);
+				border-radius: 3px;
+			}
+
+			.close-icon {
+				position: absolute;
+				width: vw(40);
+				height: vw(40);
+				top: 0;
+				left: 0;
+				right: 0;
+				bottom: 0;
+				margin: auto;
+				@include icon(40, rgba(0, 0, 0, 0.5));
+			}
+		}
+
+		.add {
+			// width: vw(100);
+			// height: vw(100);
+			@include flex-y(center);
+			color: #999;
+			background: #F2F2F2;
+			border: 1px solid #f5f5f5;
+			border-radius: vw(5);
+			box-sizing: border-box;
+
+			.default-icon {
+				@include icon(60, $btn-color);
+			}
+
+			.tips {
+				@include word-vw(12, #cccccc);
+			}
+		}
+	}
+</style>

+ 237 - 0
src/components/Navbar/Navbar.vue

@@ -0,0 +1,237 @@
+<template>
+	<view class="">
+		<uni-nav-bar v-if="navType === 'custom'" :status-bar="true" :shadow="false" :border="false" :fixed="true"
+			:color="color" :background-color="backgroundColor" :leftWidth="leftWidth" :rightWidth="rightWidth">
+			<view class="" style="width: 100%">
+				<slot></slot>
+			</view>
+		</uni-nav-bar>
+		<uni-nav-bar v-else-if="navType === 'search'" :title="title" :status-bar="true" :shadow="false" :border="false"
+			:fixed="true" :color="color" :background-color="backgroundColor" :leftWidth="leftWidth"
+			:rightWidth="rightWidth">
+			<view slot="left">
+				<IconText v-if="showBack" style="padding: 8px;" @click.native="handle_click_search" :color="color"
+					:code="`\ue8be`" size="16" />
+			</view>
+		</uni-nav-bar>
+		<uni-nav-bar v-else-if="navType === 'front'" :title="title" :status-bar="true" :shadow="false" :border="false"
+			:fixed="true" :color="color" :background-color="backgroundColor" :leftWidth="leftWidth"
+			:rightWidth="rightWidth" class="front-seatch-box">
+			<view slot="left" class="front-seatch-left">
+				<view class="front-seatch-title">
+					<!-- <IconText class="icon" size="18" color="#009360" :code="`\ue883`"></IconText> -->
+					<image :src="staticUrl ? staticUrl + 'front-title.png' : ''" class="pic" mode="heightFix">
+				</view>
+				<view class="front-search-box" @click="handle_click_search">
+					<IconText class="icon" size="16" color="#B3B3B3" :code="`\ue887`"></IconText>
+					搜索
+				</view>
+			</view>
+			<view class="bg"></view>
+		</uni-nav-bar>
+		<uni-nav-bar v-else-if="navType === 'user'" :title="title" :status-bar="true" :shadow="false" :border="false"
+			:fixed="true" :color="color" :background-color="backgroundColor" :leftWidth="leftWidth"
+			:rightWidth="rightWidth">
+			<view class="user-navbar-box">
+				<view class="user-navbar-bg"></view>
+				{{title}}
+			</view>
+			<view slot="left">
+				<view class="user-left">
+					<IconText style="padding: 8px;" @click.native="toMessage" :color="color" :code="`\ue899`"
+						size="20" />
+					<view class="num">{{_yesNum}}</view>
+				</view>
+			</view>
+		</uni-nav-bar>
+		<uni-nav-bar v-else :title="title" :status-bar="true" :shadow="false" :border="false" :fixed="true"
+			:color="color" :background-color="backgroundColor" :leftWidth="leftWidth" :rightWidth="rightWidth">
+			<view slot="left">
+				<IconText v-if="showBack" style="padding: 8px;" @click.native="handle_click_back" :color="color"
+					:code="`\ue8be`" size="16" />
+				<IconText v-if="showHome" style="padding: 8px;" @click.native="handle_click_home" :color="color"
+					:code="`\ue75f`" size="16" />
+			</view>
+		</uni-nav-bar>
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Vue
+	} from 'vue-property-decorator';
+	import {
+		namespace
+	} from 'vuex-class';
+	const baseModule = namespace('base');
+	@Component({})
+	export default class Navbar extends Vue {
+		@baseModule.Getter('_yesNum') _yesNum : any;
+		@Prop({
+			default: ''
+		})
+		private title ?: string; // 标题
+		@Prop({
+			default: true
+		})
+		private showBack ?: boolean; // 是否展示返回按钮
+		@Prop({
+			default: false
+		})
+		private showHome ?: boolean; // 是否展示返回按钮
+		@Prop({
+			default: true
+		})
+		private statusBar ?: boolean; //
+		@Prop({
+			default: false
+		})
+		private shadow ?: boolean; //
+		@Prop({
+			default: false
+		})
+		private border ?: boolean; //
+		@Prop({
+			default: true
+		})
+		private fixed ?: boolean; //
+		@Prop({
+			default: '#ffffff'
+		})
+		private backgroundColor ?: string; //
+		@Prop({
+			default: '#000000'
+		})
+		private color ?: string; //
+		@Prop({
+			default: ''
+		})
+		private navType ?: string; //navbar类型
+		@Prop({
+			default: ''
+		})
+		private leftWidth ?: string;
+		@Prop({
+			default: ''
+		})
+		private rightWidth ?: string;
+		
+		staticUrl : string = this.$oss_url; //oss地址
+
+		handle_click_back() : void {
+			console.log(this.$Router)
+			this.$Router.back(1);
+		}
+
+		handle_click_search() {
+			this.$Router.push({
+				path: '/packages/goods/search'
+			})
+		}
+
+		handle_click_home() {
+			this.$Router.pushTab({
+				path: '/pages/front/front'
+			})
+		}
+
+		toMessage() {
+			this.$Router.push({
+				path: '/packages/user/user/message'
+			})
+		}
+	}
+</script>
+
+<style lang="scss">
+	// .front-seatch-box{
+	// 	background: linear-gradient(270deg, #EBF2F0 -6%, #F3F4F4 110%);
+	// }
+	.front-search-box {
+		height: vw(32);
+		// width: vw(124);
+		box-sizing: border-box;
+		// border: vw(1) solid rgba(255, 255, 255, 0.3);
+		border-radius: vw(16);
+		@include flex-x(flex-start);
+		background: #fff;
+		position: relative;
+		z-index: 10;
+		padding-left: vw(10);
+		box-sizing: border-box;
+		flex: 1;
+		box-sizing: border-box;
+		margin-left: vw(12);
+		@include word-vw(14, #333);
+
+		.icon {
+			margin-right: vw(8);
+		}
+	}
+
+	.front-seatch-left {
+		width: 100%;
+		@include flex-x();
+	}
+
+	.front-seatch-title {
+		// position: absolute;
+		// width: calc(100vw - 20px);
+		height: 44px;
+		line-height: 44px;
+		position: relative;
+		z-index: 10;
+		// bottom: 0;
+		// z-index: 9;
+		// text-align: center;
+		font-size: vw(16);
+		@include flex-x(center);
+		.pic{
+			height: 36px;
+		}
+	}
+
+	.user-left {
+		@include flex-x();
+		position: relative;
+		height: vw(24);
+		.num{
+			position: absolute;
+			top: 0;
+			right: vw(2);
+			min-width: vw(12);
+			height: vw(12);
+			background: #CF174E;
+			@include flex-x(center);
+			border-radius: vw(6);
+			@include word-vw(10, #fff);
+			padding: 0 vw(3);
+		}
+	}
+
+	.bg {
+		position: absolute;
+		width: 100%;
+		height: 100%;
+		background: linear-gradient(270deg, #EBF2F0 -6%, #F3F4F4 110%);
+		top: 0;
+		left: 0;
+	}
+
+	.user-navbar-box {
+		width: 100%;
+		@include flex-x(center);
+
+		.user-navbar-bg {
+			position: absolute;
+			width: 100%;
+			height: 100%;
+			top: 0;
+			left: 0;
+			background: linear-gradient(90deg, #FEF4F6 0%, #F2FBFB 100%);
+			z-index: -1;
+		}
+	}
+</style>

+ 94 - 0
src/components/NoData/NoData.vue

@@ -0,0 +1,94 @@
+<template>
+	<view class="nodata" v-if="show">
+		<view class="main" :style="{paddingTop:topNum+'%'}">
+			<image class="nodata-img" mode="widthFix" :src="backImageUrl?backImageUrl+imgUrl:''"></image>
+			<text class="nodata-content" v-if="content">{{ content || '' }}</text>
+			<text class="nodata-title" v-if="title">{{ title || '' }}</text>
+			<text class="nodata-desc" v-if="desc">{{ desc || '' }}</text>
+		</view>
+	</view>
+</template>
+
+<script lang='ts'>
+	import {
+		Component,
+		Prop,
+		Vue
+	} from 'vue-property-decorator';
+	// import {
+	// 	Getter,
+	// 	Mutation
+	// } from 'vuex-class';
+	import {
+		OSS_STATIC
+	} from '@/common/constants';
+	@Component({})
+
+	export default class NoData extends Vue {
+		@Prop({
+			default: false
+		}) show ? : boolean; //是否展示
+		@Prop({
+			default: 30
+		}) topNum ? : number; //距离顶部的距离
+		@Prop({
+			default: "没有数据"
+		}) title ? : string; //title展示
+		@Prop({
+			default: ""
+		}) content ? : string; //content展示
+		@Prop({
+			default: ""
+		}) desc ? : string; //desc展示
+		@Prop({
+			default: "no-data.png"
+		}) imgUrl ?: string;
+		backImageUrl: string = OSS_STATIC //oss地址
+
+		created() {}
+		mounted() {}
+		//methods---------------
+
+	}
+</script>
+
+<style lang='scss' scoped>
+	.nodata {
+		position: relative;
+		text-align: center;
+
+		.main {
+			@include flex-y();
+
+			.nodata-img {
+				margin-bottom: vw(10);
+				/* @include wh(148, 146); */
+				width: vw(200);
+				/* flex: 0; */
+			}
+
+			.nodata-content {
+				@include word-vw(16, #333333);
+				font-weight: bold;
+			}
+
+			.nodata-title {
+				/* margin-top: vw(6); */
+				flex: 0;
+				/* width: vw(200); */
+				font-size: vw(14);
+				color: $gray9;
+				line-height: vw(19);
+			}
+
+			.nodata-desc {
+				flex: 1;
+				width: vw(200);
+				line-height: vw(19);
+				font-size: vw(12);
+				color: $gray9;
+				margin-top: vw(10);
+			}
+		}
+	}
+</style>

+ 184 - 0
src/components/OrderItem/OrderItem.vue

@@ -0,0 +1,184 @@
+<template>
+	<view class="order-main">
+		<view class="sku" v-for="(sku, index) in sku" :key="index">
+			<view style="position: relative;">
+				<image class="image" :src="sku.masterPic" mode="aspectFill"></image>
+				<!-- <view class="status" v-if="sku.status === 1">售后中</view>
+				<view class="status" v-if="sku.status === 2">售后成功</view> -->
+			</view>
+			<view class="title-wrap">
+				<text class="name">{{ sku.name }}</text>
+				<text class="attrs">{{ sku.attrs | attrsFilter }}</text>
+				<view class="bottom">
+					x{{ sku.num }}
+					<view class="price-wrap">
+						<text>¥{{ sku.price | moneyFormat }}</text>
+					</view>
+				</view>
+				<!-- <view class="th" v-if="isTh">
+					<view class="btn" @click="selectGoods">退款</view>
+				</view> -->
+			</view>
+		</view>
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Watch
+	} from 'vue-property-decorator';
+	@Component({
+		filters: {
+			attrsFilter(val: any): string {
+				let str = '';
+				val.forEach((item: any) => {
+					str += item.keyName + ':' + item.value + '';
+				});
+				return str;
+			},
+			moneyFormat(val: any) {
+				if (!+val) return '0.00';
+				return (+val).toFixed(2);
+			}
+		}
+	})
+	export default class OrderItem extends Vue {
+		@Prop({
+			default: []
+		})
+		sku!: any; //规格列表
+		@Prop({
+			default: 0
+		})
+		total!: number; //合计
+		@Prop({
+			default: true
+		})
+		isTotal!: number; //显示合计
+		@Prop({
+			default: false
+		})
+		isTh!: boolean; //显示合计
+		@Prop({
+			default: null
+		})
+		oid!: any; //显示合计
+		@Watch('sku', {
+			deep: true
+		})
+		skuChange(val: any) {
+			console.log(55555, val)
+		}
+
+		selectGoods() {
+			this.$Router.push({
+				path: "/packages/order/select-goods",
+				query: {
+					skuList: this.sku,
+					oid: this.oid
+				}
+			})
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.word14 {
+		@include word-vw(14);
+	}
+
+	.word12 {
+		@include word-vw(12, $gray9);
+	}
+
+	.order-main {
+		@include flex-y(flex-start, flex-start);
+		// border-bottom: 1px solid $line-color;
+		// border-top: 1px solid $line-color;
+		width: 100vw;
+		background: white;
+
+		.sku {
+			width: 100%;
+			@include flex-x(flex-start, flex-start);
+			padding: 0 vw(15) vw(8);
+			box-sizing: border-box;
+
+			.image {
+				width: vw(64);
+				height: vw(64);
+				border-radius: vw(6);
+				display: block;
+			}
+			
+			.status{
+				height: vw(16);
+				width: 100%;
+				background: #D3325C;
+				position: absolute;
+				bottom: 0;
+				@include word-vw(12, #fff);
+				@include flex-x(center);
+				border-bottom-left-radius: vw(6);
+				border-bottom-right-radius: vw(6);
+			}
+
+			.title-wrap {
+				@include flex-y(flex-start, flex-start);
+				margin-left: vw(10);
+				flex: 3;
+
+				.name {
+					width: 100%;
+					@include word-vw(14, #333);
+					@include multi(2);
+				}
+
+				.attrs {
+					@include word-vw(12, #999);
+					margin-top: vw(3);
+				}
+
+				.bottom {
+					margin-top: vw(12);
+					width: 100%;
+					@include word-vw(12, #333);
+					@include flex-x();
+				}
+
+				.th {
+					width: 100%;
+					@include flex-x(flex-end);
+					margin-top: vw(6);
+
+					.btn {
+						width: vw(90);
+						height: vw(30);
+						border-radius: vw(15);
+						border: vw(1) solid #BF2071;
+						background: #FFEBF1;
+						@include flex-x(center);
+						@include word-vw(14, #333);
+						box-sizing: border-box;
+					}
+				}
+			}
+
+			.price-wrap {
+				@include flex-y(flex-start, flex-end);
+				flex: 1;
+			}
+		}
+
+		.total {
+			width: 100%;
+			text-align: right;
+			padding: vw(8) vw(15);
+			box-sizing: border-box;
+		}
+	}
+</style>

+ 229 - 0
src/components/Password/Password.vue

@@ -0,0 +1,229 @@
+<template>
+	<uni-popup ref="popup" type="center">
+		<view class="pass-wrap">
+			<IconText class="close" :size="14" :code="`\ue87d`" @click.native="close"></IconText>
+			<view class="title">请输入安全密码</view>
+			<!-- <text class="sub-title" id="sub-title">输入安全密码</text> -->
+			<!-- <text class="sub-title">查看钱包数据</text> -->
+			<view class="tip" v-if="money">金额</view>
+			<view class="money" v-if="money">{{money | moneyFormat}}</view>
+			<view class="line"></view>
+			<view class="pass-main">
+				<view class="rect-wrap">
+					<view class="rect" v-for="(item, i) in new Array(6).fill(0)" :key="i">
+						<view class="circle" v-if="num>i"></view>
+					</view>
+				</view>
+				<input :focus="focusValue" :maxlength="6" v-model="password" class="input" type="number"
+					@input="changeInput">
+			</view>
+			<text class="forget" @click="forget">忘记密码?</text>
+		</view>
+	</uni-popup>
+</template>
+
+<script lang="ts">
+	/**
+	 * Icons 图标
+	 * @emit {String} finish 输入满6位向父组件传递输入内容
+	 * 可配合ref调用open()和close()方法
+	 */
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		// Ref,
+		Watch
+	} from 'vue-property-decorator';
+	import pubKey from '@/pages/login/pubKey';
+	// @ts-ignore
+	import JSEncrypt from '@/common/jsencrypt.js';
+	@Component({
+		filters: {
+			moneyFormat(val: any) {
+				if (!+val) return '0.00';
+				return (+val).toFixed(2);
+			}
+		}
+	})
+	export default class Password extends Vue {
+		@Prop({
+			default: 0
+		})
+		money ? : any
+		code: string = '\ue76b';
+		password: string = "";
+		num: number = 0;
+		flag: boolean = false;
+		focusValue: boolean = false
+		open(): void {
+			this.num = 0;
+			this.password = '';
+			(this.$refs.popup as any).open('center')
+			this.$nextTick(() => {
+				this.focusValue = true
+			})
+		}
+		close(): void {
+			(this.$refs.popup as any).close();
+			this.closePwd();
+			this.focusValue = false
+		}
+		@Emit('finish')
+		emitDone(val: string) {
+			console.log(val)
+			let timeStamp = (+new Date() + '').substr(0, 10);
+			let pass = this.rsa(`${val}\\n${timeStamp}\\n`);
+			return {
+				timeStamp,
+				pass
+			}
+		}
+		
+		@Emit('closePwd')
+		closePwd() {}
+
+		@Watch('password')
+		getPassword(val: string) {
+			this.num = val.length
+			if (this.num == 6) {
+				// 密码已填写完成
+				!this.flag && this.emitDone(val);
+				this.flag = true;
+				this.empty();
+				// this.close();
+			}
+		}
+
+		empty() {
+			this.num = 0;
+			this.password = '';
+			this.flag = false;
+		}
+
+		changeInput(event: any) {
+			// const value: string = event.target.value
+			// this.num = value.length
+			// if (this.num == 6) {
+			// 	// 密码已填写完成
+			// 	this.emitDone(value);
+			// }
+		}
+		forget() {
+			this.$Router.push({
+				path: '/packages/user/code',
+				query: {
+					type: 'update',
+					name: 'pay'
+				}
+			})
+		}
+		rsa(pass: string) {
+			console.log('加密前', pass)
+			var encryptor = new JSEncrypt() // 创建加密对象实例
+			encryptor.setPublicKey(pubKey) //设置公钥
+			return encryptor.encrypt(pass) || '加密失败'
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.pass-wrap {
+		width: vw(300);
+		// height: vw(180);
+		border-radius: vw(10);
+		background: white;
+		@include flex-y();
+		position: relative;
+
+		.close {
+			position: absolute;
+			top: vw(10);
+			right: vw(10);
+		}
+
+		.title {
+			margin: vw(27) auto vw(16);
+			@include word-vw(16, #333);
+		}
+
+		.sub-title {
+			@include word-vw(14)
+		}
+		
+		.tip{
+			@include word-vw(14, #333);
+		}
+		
+		.money{
+			@include word-vw(30, #333);
+			font-weight: 600;
+			margin-top: vw(6);
+		}
+		
+		.line{
+			width: vw(280);
+			border-bottom: vw(1) solid #F5F5F5;
+			margin-top: vw(10);
+		}
+
+		.pass-main {
+			margin-top: vw(12);
+			position: relative;
+			width: vw(240);
+			height: vw(32);
+			text-align: center;
+
+			.input {
+				position: absolute;
+				left: -100vw;
+				top: 0;
+				width: 200vw;
+				height: vw(32);
+				text-align: left;
+			}
+
+			.rect-wrap {
+				width: 100%;
+				@include flex-x(space-between);
+				text-align: center;
+				position: absolute;
+				left: 0;
+				top: 0;
+
+				.rect {
+					width: vw(32);
+					height: vw(32);
+					border-radius: vw(5);
+					background-color: #F5F5F5;
+
+					@include flex-x(center, center);
+
+					.circle {
+						width: vw(6);
+						height: vw(6);
+						border-radius: vw(6);
+						background: #333;
+						;
+						// line-height: vw(8);
+						// transform: scale(4);
+						// @include flex-x(center, center);
+						// height: vw(60);
+						// line-height: vw(1);
+					}
+				}
+			}
+		}
+
+		.forget {
+			width: 100%;
+			text-align: center;
+			// padding-right: vw(28);
+			@include word-vw(14, $gray3);
+			box-sizing: border-box;
+			margin-top: vw(32);
+			margin-bottom: vw(16);
+		}
+	}
+</style>

+ 157 - 0
src/components/SearchBox/SearchBox.vue

@@ -0,0 +1,157 @@
+<template>
+	<view class='search-content'>
+		<!-- 首页搜索 -->
+		<view class="search-box" v-if="typeFlag == 'base'" @click="toPage">
+			<view class="search-left">
+				<!-- <text class="icon">&#xe885;</text> -->
+				<IconText class="icon" :code="`\ue885`" size="14" color="#BFBFBF"></IconText>
+				<input type="text" value="" placeholder="搜索商品名称/品牌/品类" disabled="false" />
+			</view>
+			<text class="search-btn">搜索</text>
+		</view>
+		<!-- 搜索页面搜索 -->
+		<view class="search-box1" v-if="typeFlag == 'searchPage'">
+			<view class="search-left1">
+				<IconText class="icon1" :code="`\ue885`" size="14" color="#BFBFBF"></IconText>
+				<input type="text" class="input-styl1" placeholder-class="placeholder" confirm-type="search" :value="searchContent" @input="changeInput"
+					@confirm="inputSearch" placeholder="搜索商品名称" />
+				<!-- <text class="icon1" v-if="iconShow == true" @click="deleteContent">&#xe70e;</text> -->
+				<IconText class="icon1" :code="`\ue88a`" size="16" color="#999"></IconText>
+			</view>
+			<text class="search-btn1" @click="clickCancel">取消</text>
+		</view>
+
+	</view>
+</template>
+<script lang='ts'>
+	import {
+		Component,
+		Prop,
+		Watch,
+		Emit,
+		Vue
+	} from 'vue-property-decorator';
+	@Component({})
+
+	export default class SearchBox extends Vue {
+		@Prop({
+			default: "base"
+		}) private typeFlag ? : string; //搜索框类型
+		@Prop({
+			default: ""
+		}) private searchTitle ? : string; //搜索内容 父->子
+		searchContent: string = ''; //搜索框内容
+		iconShow: boolean = false; //搜索框删除icon
+
+		// methods
+		//@input修改input内容
+		changeInput(e: any) {
+			this.searchContent = e.detail.value;
+		}
+		//删除筛选内容
+		deleteContent() {
+			this.searchContent = '';
+		}
+		//跳转页面
+		toPage() {
+			this.$Router.push({
+				path: '/packages/goods/search',
+				query: {}
+			});
+		}
+
+
+		// emit-----------------------
+		@Emit('cancelEvent') //点击取消按钮
+		//点击取消按钮
+		clickCancel() {
+			this.searchContent = '';
+		}
+		@Emit('inputSearch') //点击键盘上的搜索
+		inputSearch() {
+			if (this.searchContent == '') {
+				// uni.showToast({
+				// 	title: '请输入搜索内容',
+				// 	icon: 'none'
+				// });
+				return "";
+			} else {
+				return this.searchContent;
+			}
+		}
+		// watch-------------------
+		@Watch('searchContent') //监听是否有搜索内容,展示删除icon
+		changeIconShow() {
+			this.iconShow = this.searchContent !== '';
+		}
+		@Watch('searchTitle') //监听父组件点击历史搜索记录,更新搜索title
+		changeSearchContent() {
+			if (this.searchTitle !== '') {
+				this.searchContent = this.searchTitle || '';
+			}
+		}
+
+	}
+</script>
+
+<style lang='scss' scoped>
+	.search-content {
+		font-size: vw(14);
+
+		.search-box {
+			@include flex-x();
+			@include wh(348, 32);
+			margin: 0 auto;
+			background-color: #F6F6F6;
+			border-radius: vw(8);
+
+			.search-left {
+				@include flex-x();
+
+				.icon {
+					margin: 0 vw(10);
+					@include icon(14);
+				}
+			}
+
+			.search-btn {
+				padding-left: vw(12);
+				margin-right: vw(13);
+				border-left: 1px solid #E3E3E3;
+				color: $btn-color;
+				flex-shrink: 0;
+			}
+		}
+
+		.search-box1 {
+			@include flex-x();
+			@include wh(348, 32);
+			margin: 0 auto;
+
+			.search-left1 {
+				@include flex-x(flex-start);
+				@include wh(293, 32);
+				border-radius: vw(8);
+				background-color: #F6F6F6;
+
+				.icon1 {
+					margin: 0 vw(10);
+					@include icon(14);
+				}
+
+				.input-styl1 {
+					width: 80%;
+				}
+				.placeholder{
+					color: #999;
+				}
+			}
+
+			.search-btn1 {
+				padding-left: vw(12);
+				margin-right: vw(13);
+				color: $btn-color;
+			}
+		}
+	}
+</style>

+ 162 - 0
src/components/ShopShare/ShopShare.vue

@@ -0,0 +1,162 @@
+<template>
+	<view class="share-container">
+		<uni-popup ref="popup" type="center">
+			<view class="wrapper" v-if="popShow">
+				<canvas canvas-id="shareCanvas" class="canvas" style="width: 250px;height:430px;"></canvas>
+				<view class="bottom">
+					<button class="bottom-btn" open-type="share">
+						<image :src="static + 'wechat.png'"></image>
+						<view class="text">分享好友</view>
+					</button>
+					<view class="bottom-btn" @click="saveImageToPhotos('shareCanvas')">
+						<image :src="static + 'download.png'"></image>
+						<view class="text">保存图片</view>
+					</view>
+				</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script lang="ts">
+	// @ts-nocheck
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Mixins
+	} from 'vue-property-decorator';
+	import {
+		types
+	} from '@/common/store';
+	import {
+		OSS_STATIC
+	} from '@/common/constants';
+	import canvasMixin from '@/common/mixins/canvasMixin.ts';
+	import {
+		namespace
+	} from 'vuex-class';
+	const canvasModule = namespace('canvas');
+	const baseModule = namespace('base');
+	@Component({})
+	export default class ShopShare extends Mixins(canvasMixin) {
+		@canvasModule.Getter('_canvasData') _canvasData: any;
+		@baseModule.Getter('_userInfo') _userInfo: any;
+		popShow: boolean = false;
+		static: string = OSS_STATIC;
+
+		closePop(): void {
+			(this.$refs.popup as any).close();
+			this.popShow = false;
+		}
+		openPop(): void {
+			(this.$refs.popup as any).open();
+			this.popShow = true;
+			uni.showLoading({
+				title: '加载中'
+			});
+			this.drawPoster();
+		}
+		mounted() {}
+		drawPoster(): void {
+			// 绘制海报
+			// 注意:page页面canvas-id获取ctx,组件需传this
+			const that = this;
+			const ctx = uni.createCanvasContext('shareCanvas', this);
+			// 绘制白色底
+			this.roundRect(ctx, 0, 0, 250, 460, '#ffffff', 8, 8, 8, 8);
+			this.roundRect(ctx, 0, 0, 250, 48, '#fff', 8, 0, 0, 8);
+			// 绘制头像
+			this.drawCircular(ctx, 24, 24, 13, 15, that._canvasData.avatar);
+			this.ellipsisText(
+				ctx,
+				that._userInfo.nickname,
+				200,
+				43,
+				13,
+				'#999',
+				'10px',
+				14
+			);
+			// 绘制宣传语
+			this.ellipsisText(
+				ctx,
+				that._canvasData.tips,
+				200,
+				43,
+				27,
+				'#454545',
+				'10px',
+				14
+			);
+			this.textSet(ctx, '”', '45px', 135, 20, '#ddd');
+			// 绘制店铺图片
+			this.drawImgInfo(
+				ctx,
+				10,
+				50,
+				230,
+				230,
+				that._canvasData.shareImg,
+				// that._canvasData.width,
+				// that._canvasData.height
+			);
+			// this.textSet(ctx, that._canvasData.title, '24px', 13, 360, '#333', 'bold ');
+			this.textSet(ctx, '店铺说明', '10px', 13, 348, '#999');
+			this.textSet(ctx, '商城名称', '14px', 13, 365, '#000', 'bold');
+			// // 小程序码
+			ctx.drawImage(that._canvasData.qr, 150, 295, 90, 90);
+			this.textSet(ctx, '长按识别进店铺', '10px', 90, 400, '#999999');
+			ctx.draw(true, () => {
+				console.log('draw,true');
+				uni.hideLoading();
+			});
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.wrapper {
+		@include flex-y();
+		width: 250px;
+	}
+
+	.canvas {
+		border-radius: vw(5);
+		overflow: hidden;
+		margin-top: vw(50);
+	}
+
+	.bottom {
+		width: 230px;
+		margin-top: vw(15);
+		@include flex-x();
+
+		.text {
+			@include word-vw(14, white);
+			line-height: vw(20);
+			margin-top: vw(5);
+		}
+
+		image {
+			width: vw(60);
+			height: vw(60);
+		}
+	}
+
+	button {
+		background: none;
+		line-height: 1;
+		padding: 0;
+		margin: 0;
+	}
+
+	button::after {
+		border: 0px;
+	}
+
+	.button-hover {
+		background: none;
+	}
+</style>

+ 140 - 0
src/components/ShowModal/ShowModal.vue

@@ -0,0 +1,140 @@
+<template>
+	<uni-popup ref="popup" type="center">
+		<view class="show-modal">
+			<Icon class="close" @click="close" :code="`\ue76b`" color="#999" size="10"></Icon>
+			<view class="title">{{title}}</view>
+			<text class="content">{{content}}</text>
+			<view class="btn-box" :class="{'btn-styl': leftBtnText}">
+				<view class="btn cancel-btn" @click="close" v-if="leftBtnText">{{leftBtnText}}</view>
+				<view class="btn" @click="submit">{{btnText}}</view>
+			</view>
+		</view>
+	</uni-popup>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Ref,
+		Watch
+	} from 'vue-property-decorator';
+	@Component({})
+	export default class ShowModal extends Vue {
+		@Prop({
+			default: ''
+		})
+		private title ? : string; //
+
+		@Prop({
+			default: ''
+		})
+		private content ? : string; //
+
+		@Prop({
+			default: ''
+		})
+		private btnText ? : string; //
+
+		@Prop({
+			default: ""
+		})
+		private leftBtnText ? : string; //
+
+		open() {
+			(this.$refs.popup as any).open();
+		}
+
+		close() {
+			(this.$refs.popup as any).close();
+		}
+
+		// emit---------------------------
+		@Emit('submit')
+		submit() { //弹窗点击确认按钮
+			this.close();
+			return '点击确认'
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.show-modal {
+		background: #fff;
+		width: vw(300);
+		@include flex-y();
+		border-radius: vw(10);
+		position: relative;
+
+		.close {
+			position: absolute;
+			right: vw(5);
+			top: vw(5);
+			padding: vw(5);
+		}
+
+		.title {
+			@include word-vw(16, #333);
+			margin-top: vw(25);
+		}
+
+		.content {
+			@include word-vw(14, #666);
+			margin-top: vw(12);
+			text-align: center;
+		}
+
+		.btn {
+			width: vw(65);
+			height: vw(35);
+			line-height: vw(35);
+			text-align: center;
+			background: $btn-color;
+			@include word-vw(14, #fff);
+			border-radius: vw(5);
+			margin-top: vw(16);
+			margin-bottom: vw(20);
+		}
+
+		.cancel-btn {
+			margin-right: 32px;
+			background: #EBEBEB;
+			color: #333;
+		}
+
+		.btn-cancel {
+			width: vw(150);
+			height: vw(35);
+			line-height: vw(35);
+			text-align: center;
+			background: #1A1A1A;
+			@include word-vw(14, #fff);
+			border-radius: vw(4);
+			margin-top: vw(28);
+			margin-bottom: vw(15);
+		}
+
+		.btn-box {
+			border-top: vw(1) solid #F5F5F5;
+			margin-top: vw(10);
+			width: vw(200);
+			@include flex-x(center);
+		}
+
+		.btn-styl {
+			@include flex-x(center);
+
+			.btn {
+				width: vw(90);
+			}
+
+			.btn-cancel {
+				width: vw(90);
+				margin-right: vw(20);
+			}
+		}
+
+	}
+</style>

+ 266 - 0
src/components/SmsCode/SmsCode.vue

@@ -0,0 +1,266 @@
+<template>
+	<uni-popup ref="popup" type="center">
+		<view class="pass-wrap">
+			<IconText class="close" :size="10" :code="`\ue847`" @click.native="close"></IconText>
+			<view class="title">提示</view>
+			<text class="sub-title" id="sub-title">请输入您的手机动态验证码</text>
+			<text class="sub-title">{{userInfo.phone | phoneFormat}}</text>
+			<view class="tip" v-if="money">金额</view>
+			<view class="money" v-if="money">{{money | moneyFormat}}</view>
+			<view class="line"></view>
+			<view class="pass-main">
+				<view class="rect-wrap">
+					<view class="rect" v-for="(item, i) in new Array(6).fill(0)" :key="i">
+						<view class="circle" v-if="num>i"></view>
+					</view>
+				</view>
+				<input :focus="focusValue" :maxlength="6" v-model="password" class="input" type="number"
+					@input="changeInput">
+			</view>
+			<text class="forget"></text>
+			<!-- <text class="forget">收不到验证码?请咨询客服</text> -->
+		</view>
+	</uni-popup>
+</template>
+
+<script lang="ts">
+	/**
+	 * Icons 图标
+	 * @emit {String} finish 输入满6位向父组件传递输入内容
+	 * 可配合ref调用open()和close()方法
+	 */
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		// Ref,
+		Watch
+	} from 'vue-property-decorator';
+	import pubKey from '@/pages/login/pubKey';
+	import {
+		namespace,
+	} from 'vuex-class';
+	import {
+		types
+	} from '@/common/store';
+	const baseModule = namespace('base');
+	// @ts-ignore
+	import JSEncrypt from '@/common/jsencrypt.js';
+	@Component({
+		filters: {
+			moneyFormat(val : any) {
+				if (!+val) return '0.00';
+				return (+val).toFixed(2);
+			},
+			phoneFormat(val : any) {
+				if (!+val) return '';
+				let arr = val.split("");
+				let pre = arr.slice(0, 3).join("");
+				let next = arr.reverse().slice(0, 4).reverse().join("");
+				return pre + "****" + next;
+			}
+		}
+	})
+	export default class Password extends Vue {
+		@baseModule.Getter('_userInfo') userInfo : any;
+		@Prop({
+			default: 0
+		})
+		money ?: any
+		code : string = '\ue76b';
+		password : string = "";
+		num : number = 0;
+		flag : boolean = false;
+		focusValue : boolean = false
+		open() : void {
+			this.num = 0;
+			this.password = '';
+			this.sendSms();
+			(this.$refs.popup as any).open('center');
+			this.$nextTick(() => {
+				this.focusValue = true
+			})
+		}
+		close() : void {
+			(this.$refs.popup as any).close()
+			this.focusValue = false
+		}
+		@Emit('finish')
+		emitDone(val : string) {
+			console.log(val)
+			// let timeStamp = (+new Date() + '').substr(0, 10);
+			// let pass = this.rsa(`${val}\\n${timeStamp}\\n`);
+			return {
+				// timeStamp,
+				// pass
+				code: val
+			}
+		}
+
+		@Watch('password')
+		getPassword(val : string) {
+			this.num = val.length
+			if (this.num == 6) {
+				// 密码已填写完成
+				!this.flag && this.emitDone(val);
+				this.flag = true;
+				this.empty();
+				this.close();
+			}
+		}
+
+		empty() {
+			this.num = 0;
+			this.password = '';
+			this.flag = false;
+		}
+
+		changeInput(event : any) {
+			// const value: string = event.target.value
+			// this.num = value.length
+			// if (this.num == 6) {
+			// 	// 密码已填写完成
+			// 	this.emitDone(value);
+			// }
+		}
+
+		sendSms() {
+			this.$http
+				.post({
+					url: this.$api.sendCode,
+					data: {
+						phone: this.userInfo.phone,
+						type: 6
+					}
+				})
+				.then(() => {
+					//验证码获取倒计时
+					// uni.hideLoading();
+					uni.showToast({
+						title: '已发送',
+						duration: 2000,
+						icon: 'none'
+					});
+				}, () => {
+					// uni.hideLoading();
+				});
+		}
+
+		forget() {
+			this.$Router.push({
+				path: '/packages/user/code',
+				query: {
+					type: 'update',
+					name: 'pay'
+				}
+			})
+		}
+		rsa(pass : string) {
+			console.log('加密前', pass)
+			var encryptor = new JSEncrypt() // 创建加密对象实例
+			encryptor.setPublicKey(pubKey) //设置公钥
+			return encryptor.encrypt(pass) || '加密失败'
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.pass-wrap {
+		width: vw(300);
+		// height: vw(180);
+		border-radius: vw(10);
+		background: white;
+		@include flex-y();
+		position: relative;
+
+		.close {
+			position: absolute;
+			top: vw(10);
+			right: vw(10);
+		}
+
+		.title {
+			margin: vw(27) auto vw(16);
+			@include word-vw(16, #333);
+		}
+
+		.sub-title {
+			@include word-vw(14)
+		}
+
+		.tip {
+			@include word-vw(14, #333);
+		}
+
+		.money {
+			@include word-vw(30, #333);
+			font-weight: 600;
+			margin-top: vw(6);
+		}
+
+		.line {
+			width: vw(280);
+			border-bottom: vw(1) solid #F5F5F5;
+			margin-top: vw(10);
+		}
+
+		.pass-main {
+			margin-top: vw(12);
+			position: relative;
+			width: vw(240);
+			height: vw(32);
+			text-align: center;
+
+			.input {
+				position: absolute;
+				left: -100vw;
+				top: 0;
+				width: 200vw;
+				height: vw(32);
+				text-align: left;
+			}
+
+			.rect-wrap {
+				width: 100%;
+				@include flex-x(space-between);
+				text-align: center;
+				position: absolute;
+				left: 0;
+				top: 0;
+
+				.rect {
+					width: vw(32);
+					height: vw(32);
+					border-radius: vw(5);
+					background-color: #F5F5F5;
+
+					@include flex-x(center, center);
+
+					.circle {
+						width: vw(6);
+						height: vw(6);
+						border-radius: vw(6);
+						background: #333;
+						;
+						// line-height: vw(8);
+						// transform: scale(4);
+						// @include flex-x(center, center);
+						// height: vw(60);
+						// line-height: vw(1);
+					}
+				}
+			}
+		}
+
+		.forget {
+			width: 100%;
+			text-align: center;
+			// padding-right: vw(28);
+			@include word-vw(14, $gray3);
+			box-sizing: border-box;
+			margin-top: vw(32);
+			margin-bottom: vw(16);
+		}
+	}
+</style>

+ 528 - 0
src/components/SpecPopup/SpecPopup.vue

@@ -0,0 +1,528 @@
+<template>
+	<view class='content'>
+		<uni-popup ref="popup" @maskClick="maskClick" :safe-area="false" @change="handleChange">
+			<view class="spec-popup">
+				<view class="goods-styl">
+					<image @click="previewImage(showImg)" class="image-styl" :src="showImg" mode="aspectFit"></image>
+					<view class="goods-info">
+						<!-- <view class="member">{{roleMap[userInfo.role]}}价</view> -->
+						<view class="name-styl">{{product.name}}</view>
+						<view class="stock-styl">库存{{showStock}}件</view>
+						<view class="price-styl">
+							<text>¥{{gooodPrice}}</text>
+							<view class="num-right">
+								<view class="num-cut" @click="numCut">-</view>
+								<view class="num-styl">
+									<!-- {{goodsNum}} -->
+									<input type="number" style="text-align: center" v-model.number="goodsNum"
+										@input="onChange">
+								</view>
+								<view class="num-add" @click="numAdd">+</view>
+							</view>
+						</view>
+						<!-- <view>{{specMsg||'请选择规格'}}</view> -->
+					</view>
+					<!-- <text class="icon" style="padding: 6px;" @click="close">&#xe6f0;</text> -->
+				</view>
+				<!-- <scroll-view scroll-y="true" show-scrollbar="false" class="spec-module">
+					<view class="spec-styl" v-for="(item,index) in specList" :key="index">
+						<view class="spec-title">{{item.name}}</view>
+						<view class="spec-list">
+							<view class="spec-card" v-for="(eve,val) in specList[index].value" :key="val"
+								:class="{'spec-card1':chooseData[index] == eve}" @click="clickCard(index,eve)">{{eve}}
+							</view>
+						</view>
+					</view>
+				</scroll-view> -->
+				<MiniSpec :specData="goodsPopup" @getChoose="getShowMsg" @findSku="findSku"></MiniSpec>
+				<!-- <view class="goods-num">
+					<view class="num-title">数量</view>
+					<view class="num-right">
+						<view class="num-cut" @click="numCut">&#xe71a;</view>
+						<view class="num-styl">{{goodsNum}}</view>
+						<view class="num-add" @click="numAdd">&#xe60f;</view>
+					</view>
+				</view> -->
+				<view class="btn-styl">
+					<view class="add-btn" @click="checkData('add')" v-if="typeName === 'base'">加入购物车</view>
+					<view class="buy-btn" @click="checkData('buy')" v-if="typeName === 'base'">立即购买</view>
+					<!-- 详情页按钮 -->
+					<view class="add-btn1" @click="checkData('add')" :class="{disable: chooseSku.stock <= 0}"
+						v-if="typeName === 'goodsDetail' && btnShow==='add'">{{chooseSku.stock <= 0 ? '已售罄' : '选好了'}}
+					</view>
+					<view class="add-btn1" @click="checkData('buy')" :class="{disable: chooseSku.stock <= 0}"
+						v-if="typeName === 'goodsDetail' && btnShow==='buy'">{{chooseSku.stock <= 0 ? '已售罄' : '选好了'}}
+					</view>
+				</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+<script lang='ts'>
+	import {
+		Component,
+		Prop,
+		Vue,
+		Watch,
+		Emit
+	} from 'vue-property-decorator';
+	import {
+		Getter,
+		Mutation
+	} from 'vuex-class';
+	import {
+		namespace
+	} from 'vuex-class';
+	const baseModule = namespace('base');
+	@Component({
+		filters: {
+			moneyFormat(val: any) {
+				if (!+val) return '0.00';
+				return (+val).toFixed(2);
+			},
+			stockFormat(val: any) {
+				if (!val || val === 0) {
+					return '已售罄';
+				}
+				if (val > 50) {
+					return '库存充足';
+				} else if (val > 30 && val < 50) {
+					return '库存不足';
+				} else {
+					return '少量剩余';
+				}
+			}
+		}
+	})
+
+	export default class Name extends Vue {
+		@baseModule.Getter('_userInfo') userInfo: any;
+		@Prop({
+			default: {
+				spu_info: {},
+				skuList: []
+			}
+		}) product ? : any; //组件弹窗所用数据
+
+		@Prop({
+			default: 'base'
+		}) typeName ? : string; //使用组件类型 base按钮全要,goodsDetail区分展示加购or购买
+		@Prop({
+			default: 'add'
+		}) btnShow ? : string; //展示加购or购买按钮
+
+		goodsNum: number = 1; //商品数量
+		chooseData: any = {}; //选择规格
+		// specList: Array < object > = [{
+		// 		name: '型号',
+		// 		value: ['1号', '2号', '3号', '4号'],
+		// 	},
+		// 	{
+		// 		name: '大小',
+		// 		value: ['大大大', '小小小', '中中中'],
+		// 	}
+		// ]
+
+		goodsPopup: any = {
+			skuList: []
+		}
+		chooseSku: any = {}
+		specMsg: string = "" // 提示信息,
+
+		roleMap: any = {}
+
+		// get========================================================
+		get showImg() {
+			// return this.goodsPopup.masterPic || ''
+			if (Object.keys(this.chooseSku).length > 0) {
+				return this.chooseSku.pic;
+			}
+			if (Object.keys(this.goodsPopup).length > 0) {
+				return this.goodsPopup.masterPic;
+			}
+		}
+
+		get gooodPrice() {
+			if (Object.keys(this.chooseSku).length > 0) {
+				return this.chooseSku.price;
+			}
+			if (Object.keys(this.goodsPopup).length > 0) {
+				return this.goodsPopup.minPrice;
+			}
+		}
+
+		get showStock() {
+			if (Object.keys(this.chooseSku).length > 0) {
+				if (this.goodsNum > this.chooseSku.stock) this.goodsNum = (this.chooseSku.stock || 1);
+				return this.chooseSku.stock || 0;
+			}
+			if (Object.keys(this.goodsPopup).length > 0) {
+				return this.goodsPopup.minPrice;
+			}
+		}
+
+		// watch==========================================
+		@Watch('product', {
+			deep: true,
+			immediate: true
+		})
+		productChange(val: any) {
+			if (Object.keys(val).length) {
+				// 单规格商品且不存在attrs
+				console.log(213123, val)
+				if (val.skuList[0] && !val.skuList[0]?.attrs) {
+					this.chooseSku = JSON.parse(JSON.stringify(val.skuList[0]))
+				}
+				this.goodsPopup = JSON.parse(JSON.stringify(val))
+				console.log('传给minispec数据', this.goodsPopup)
+			}
+		}
+
+		//methods---------------
+		//点击规格卡片
+		clickCard(index: number, val: string): void {
+			if (this.chooseData[index] === val) {
+				// this.chooseData[index] = val;
+				this.$set(this.chooseData, index, '')
+			} else {
+				this.$set(this.chooseData, index, val)
+			}
+			// console.log(index, val);
+			// console.log('选择数据', this.chooseData);
+		}
+		//减商品数量
+		numCut(): void {
+			if (this.goodsNum > 1) {
+				this.goodsNum--;
+			}
+		}
+		numAdd(): void {
+			if (this.chooseSku.stock < this.goodsNum + 1) {
+				uni.showToast({
+					title: "已超出最大库存",
+					icon: 'none',
+					durtion: 2000
+				})
+				return
+			};
+			this.goodsNum++;
+		}
+		//点击遮罩层关闭弹窗
+		maskClick() {
+			this.emitType(false);
+		}
+		//打开弹窗
+		open(): void {
+			this.chooseData = {};
+			this.goodsNum = 1;
+
+			(this.$refs.popup as any).open('bottom')
+			this.emitType(true);
+		}
+		//关闭弹窗
+		close(): void {
+			(this.$refs.popup as any).close();
+			this.emitType(false);
+		}
+		// 获取显示所选規格情况
+		getShowMsg(detail: any) {
+			// console.log('chuan过来个啥啊', detail);
+			let selectVal = Object.values(detail);
+			let msg = "";
+			let emptyArr = [];
+			if (selectVal.includes("")) {
+				// for (let k in detail) {
+				// 	if (detail[k] === "") {
+				// 		emptyArr.push(k);
+				// 	}
+				// }
+				// // 未选中的规格
+				// // msg =  emptyArr.join(" ");
+				this.chooseSku = {};
+			} else {
+				msg = selectVal.join("-");
+			}
+			this.specMsg = msg;
+			// this.triggerEvent('showSpecMsg', this.specMsg);
+		}
+
+		findSku(detail: any) {
+			// console.log('this.id------>', detail)
+			this.goodsPopup.skuList.some((item: any) => {
+				if (item.id === detail) {
+					this.chooseSku = JSON.parse(JSON.stringify(item))
+					this.chooseSku.num = this.goodsNum
+					this.chooseSku.masterPic = this.goodsPopup.masterPic;
+					this.chooseSku.name = this.goodsPopup.name;
+					this.chooseSku.skuId = this.chooseSku.id;
+					this.chooseSku.attrsName = item.attrs.map((eve: any) => eve.value).join('-');;
+					console.log("skuobj", this.chooseSku);
+					return true;
+				}
+			});
+		}
+
+		checkData(val: string): any {
+			if (!+this.goodsNum) {
+				uni.showToast({
+					title: '请输入正确的数量',
+					icon: 'none'
+				})
+				return;
+			}
+			if (this.chooseSku.stock <= 0) {
+				uni.showToast({
+					title: '该商品已售罄',
+					icon: 'none'
+				})
+				return;
+			}
+			this.chooseSku.num = this.goodsNum;
+			if (!this.chooseSku.id) {
+				uni.showToast({
+					title: '请选择商品规格',
+					icon: 'none'
+				})
+				return;
+			}
+			val == 'add' ? this.addCart() : this.buyNow();
+		}
+
+		onChange(val: any) {
+			let value = val.detail.value;
+			this.$nextTick(() => {
+				if (isNaN(+value)) this.goodsNum = 1;
+				if (value > this.chooseSku.stock) this.goodsNum = (this.chooseSku.stock || 1);
+			})
+		}
+		
+		handleChange(e: any){
+			this.changePopup(e.show)
+		}
+
+
+		// emit----------------------
+		@Emit('buyNow') //立即购买
+		buyNow(): any {
+			this.close();
+			return this.chooseSku;
+		}
+		@Emit('changePopup') //立即购买
+		changePopup(show: any): any {
+			return show;
+		}
+		@Emit('emitType')
+		emitType(val: boolean): boolean {
+			return val;
+		}
+		@Emit('addCart') //添加购物车
+		addCart(): any {
+			this.close();
+			return this.chooseSku;
+		}
+		previewImage(pic: any) {
+			uni.previewImage({
+				urls: [pic]
+			})
+		}
+	}
+</script>
+
+<style lang='scss' scoped>
+	.content {
+		box-sizing: border-box;
+
+		.spec-popup {
+			padding: vw(20) vw(16);
+			border-top-left-radius: vw(36);
+			border-top-right-radius: vw(36);
+			background-color: #F9F9F9;
+
+			.goods-styl {
+				@include flex-x(flex-start);
+				border-bottom: 1px solid #F2F2F2;
+				background: #fff;
+				padding: vw(18);
+				border-radius: vw(30);
+
+				.image-styl {
+					@include wh(100, 100);
+					border-radius: vw(16);
+				}
+
+				.goods-info {
+					margin-left: vw(16);
+					@include word-vw(12, $gray9);
+					min-height: vw(90);
+					@include flex-y(space-between, flex-start);
+					flex: 1;
+
+					.member {
+						height: vw(24);
+						line-height: vw(24);
+						padding: 0 vw(15);
+						background: #333;
+						@include word-vw(14, #fff);
+						font-weight: 600;
+						border-radius: vw(12);
+					}
+
+					.name-styl {
+						width: 100%;
+						@include word-vw(16, #333333);
+						font-weight: bold;
+						@include flex-x();
+						@include multi(3);
+					}
+
+					.price-styl {
+						width: 100%;
+						@include word-vw(16, #333333);
+						font-weight: bold;
+						@include flex-x();
+
+						.num-right {
+							@include flex-x();
+							height: vw(32);
+							border-radius: vw(16);
+							background: #F3F3F3;
+
+							.num-cut,
+							.num-add,
+							.num-styl {
+								width: vw(24);
+								@include flex-x(center);
+							}
+
+							.num-cut {
+								padding-left: vw(8);
+							}
+
+							.num-add {
+								padding-right: vw(8);
+							}
+						}
+					}
+
+					.stock-styl {
+						/* margin: vw(2) 0 vw(20) 0; */
+					}
+				}
+
+				.icon {
+					@include icon(12, #000000);
+					position: absolute;
+					right: 20px;
+					top: 15px;
+				}
+			}
+
+			.spec-module {
+				max-height: vw(200);
+				overflow-y: scroll;
+				@include hide-scrollbar();
+
+				.spec-styl:first-child {
+					margin-top: vw(18);
+				}
+
+				.spec-styl {
+					background-color: #ffffff;
+
+					.spec-title {
+						margin: 0 0 vw(16) 0;
+					}
+
+					.spec-list {
+						@include flex-x(flex-start);
+						flex-flow: row wrap;
+
+						.spec-card {
+							padding: vw(4) vw(16);
+							margin: 0 vw(20) vw(12) 0;
+							background-color: #F2F2F2;
+							border-radius: vw(15);
+							font-size: vw(14);
+						}
+
+						.spec-card1 {
+							background-color: $main-color;
+							color: #ffffff;
+						}
+					}
+				}
+			}
+
+			.goods-num {
+				@include flex-x();
+				margin-top: vw(18);
+
+				.num-title {}
+
+				.num-right {
+					@include flex-x(flex-start);
+
+					.num-cut {
+						@include icon(26, $gray9);
+					}
+
+					.num-styl {
+						margin: 0 vw(12);
+					}
+
+					.num-add {
+						@include icon(26, $bk-color);
+					}
+				}
+			}
+
+			.btn-styl {
+				@include flex-x(center);
+				margin-top: vw(32);
+
+				view {
+					color: #ffffff;
+				}
+
+				.add-btn {
+					font-size: vw(14);
+					padding: vw(8) vw(32) vw(8) vw(28);
+					background-color: $gray3;
+					color: #ffffff;
+					border-top-left-radius: vw(22);
+					border-bottom-left-radius: vw(22);
+				}
+
+				.add-btn1 {
+					width: vw(345);
+					height: vw(50);
+					border-radius: vw(10);
+					@include flex-x(center);
+					background: $bk-color;
+
+					&.disable {
+						background: #ccc;
+						color: #fff;
+					}
+				}
+
+				.buy-btn {
+					font-size: vw(14);
+					padding: vw(8) vw(32) vw(8) vw(28);
+					background-color: $bk-color;
+					color: #ffffff;
+					border-top-right-radius: vw(22);
+					border-bottom-right-radius: vw(22);
+				}
+
+				.buy-btn1 {
+					width: vw(345);
+					height: vw(50);
+					border-radius: vw(25);
+					@include flex-x(center);
+					background: $bk-color;
+				}
+			}
+		}
+	}
+</style>

+ 191 - 0
src/components/Stepper/Stepper.vue

@@ -0,0 +1,191 @@
+<template>
+	<view class="numControl">
+		<view class="symbol" @click="decrease">
+			<!-- <text class="icon" :style="{ color: colorLeft }">{{ iconLeft }}</text> -->
+			<image class="img" :src="static ? static + 'cart-reduce.svg' : ''" mode="aspectFill"></image>
+		</view>
+		<input v-model="count" class="count" :disabled="disabled" type="number"
+			:style="{ 'background-color': inputBK,  color: color }" @input="onChange" @blur="onBlur"/>
+		<view class="plus" @click="add">
+			<!-- <text class="icon" :style="{ color: colorRight }">{{ iconRight }}</text> -->
+			<image class="img" :src="static ? static + 'cart-add.svg' : ''" mode="aspectFill"></image>
+		</view>
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Vue,
+		Emit,
+		Watch
+	} from 'vue-property-decorator';
+	import {
+		OSS_STATIC
+	} from '@/common/constants';
+	@Component({})
+	export default class Stepper extends Vue {
+		@Prop({
+			default: 1
+		})
+		num! : number; // 默认件数
+		@Prop({
+			default: 0
+		})
+		index ?: number; // 序号(购物车index)
+		@Prop({
+			default: -1
+		})
+		max ?: number; //限购件数
+		@Prop({
+			default: 1
+		})
+		threshold ?: number; // 起购件数
+		@Prop({
+			default: '\ue71c'
+		})
+		iconLeft ?: string; // 减号图标
+		@Prop({
+			default: '\ue71b'
+		})
+		iconRight ?: string; // 加号图标
+		@Prop({
+			default: '#999999'
+		})
+		colorLeft ?: string; // 减号颜色
+		@Prop({
+			default: '#333333'
+		})
+		colorRight ?: string; // 加号颜色
+		@Prop({
+			default: '#F1F1F1'
+		})
+		inputBK ?: string; // input背景色
+		@Prop({
+			default: '#333'
+		})
+		color ?: string; // input背景色
+		@Prop({
+			default: false
+		})
+		disabled ?: boolean; // 是否禁用input
+		count : number = 1;
+		static : string = OSS_STATIC;
+		created() : void {
+			this.count = this.num;
+		}
+		onChange(val : any) : void {
+			const value : number = +val.detail.value;
+			// this.$nextTick(() => {
+			// 	this.count = value > (this.threshold as number) ? value : (this.threshold as number);
+			// 	this.changeNumber('input');
+			// })
+			// this.count = value > (this.threshold as number) ? value : (this.threshold as number);
+			this.changeNumber('input');
+		}
+		
+		onBlur(val : any) : void {
+			const value : number = +val.detail.value;
+			console.log(value)
+			this.$nextTick(() => {
+				this.count = value > (this.threshold as number) ? value : (this.threshold as number);
+				this.changeNumber('input');
+			})
+			// this.count = value > (this.threshold as number) ? value : (this.threshold as number);
+			// this.changeNumber('input');
+		}
+		
+		initNumber(){
+			console.log('child');
+			this.count = this.num;
+		}
+
+		@Watch('num', {
+			immediate: true,
+		})
+		numChang() {
+			this.count = this.num;
+		}
+		@Emit('changeNumber')
+		changeNumber(val : string) {
+			return {
+				count: this.count,
+				index: this.index,
+				type: val
+			};
+		}
+		@Emit('limitChange')
+		limitChange(val : string) {
+			return {
+				content: val
+			}
+		}
+		add() : Boolean | void {
+			if (this.max && this.count >= this.max && this.max != -1) {
+				this.limitChange(`此商品限购${this.max}件`);
+				return false;
+			}
+			this.count++;
+			this.changeNumber('add');
+		}
+		decrease() : Boolean | void {
+			if (this.threshold && this.count <= this.threshold && this.threshold > 1) {
+				this.limitChange(`此商品${this.threshold}件起购`);
+				return false;
+			}
+			if (this.count <= 1) {
+				this.count = 1;
+				uni.showToast({
+					title: '最小数量为1',
+					icon: 'none'
+				})
+			} else {
+				this.count--;
+				this.changeNumber('decrease');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.numControl {
+		@include flex-x(flex-right);
+
+		.symbol {
+			width: vw(30);
+			// height: vw(40);
+			@include flex-y(center, center);
+
+			.icon {
+				@include icon(22);
+			}
+		}
+
+		.plus {
+			width: vw(30);
+			// height: vw(40);
+			@include flex-y(center, center);
+
+			.icon {
+				@include icon(22);
+			}
+		}
+
+		.img {
+			width: vw(20);
+			height: vw(20);
+		}
+
+		.count {
+			width: vw(32);
+			text-align: center;
+			height: vw(22);
+			line-height: vw(22);
+			outline: none;
+			border-radius: 100px;
+			@include word-vw(15, $gray3);
+			font-weight: bold;
+		}
+	}
+</style>

+ 59 - 0
src/components/SwiperBanner/SwiperBanner.md

@@ -0,0 +1,59 @@
+### 轮播图
+
+轮播图,用于轮播图,组件名:``SwiperBanner``
+基于 swiper、swiper-item封装的轮播组件
+
+```html
+ //右上角按钮插槽  暂时用不上  
+<view class="collection" slot="collection" @click="collectionClick" >
+	<i class="icon">&#xe686;</i>
+</view>
+```
+### 使用方式
+
+在 ``script`` 中引用组件 
+
+```javascript
+import SwiperBanner from "@/components/base/SwiperBanner.vue"
+
+@Components({
+	 components: {
+		 SwiperBanner
+	}
+})
+
+//或者
+export default {
+    components: {SwiperBanner}
+}
+```
+
+在 ``template`` 中使用组件
+
+```html
+	<swiper-banner 
+		:banner-detail="bannerDetail" 
+		:banner-h="200" 
+		:radius="5" 
+		indicatorColor="#000">
+	</swiper-banner>
+```
+### 属性说明
+
+|属性名						|类型		|默认值					|说明		|
+|---						|----		|---					|---		|
+|bannerDetail				|array		|-						|轮播数据(数组或者数组对象)|
+|imgKey						|string		|''						|单条数据对应的key值    |
+|autoPlay					|boolean	|true					|自动切换		|
+|indicatorDots				|boolean	|true					|是否自定义指示点   |
+|dotsType					|string		|dot					|指示点样式(dot/digit) 		  |
+|noIndicatorColor			|string		|rgba(255,255,255,0.6)	|未选中指示点颜色 当dotsType值为dot生效	|
+|indicatorColor				|string		|#fff					|自定义指示点颜色 当dotsType值为dot生效	|
+|bannerH					|number		|200					|轮播图高度		|
+|radius						|number		|0						|自定义圆角	|
+|preview					|boolean	|false					|开启预览图片 与点击跳转只可存在一个	|
+|bannerType					|string		|''						|轮播样式类型 '3D'、''|
+|previousNext				|string		|0rpx					| 轮播前后缩进尺寸(当bannerType为3D时使用)|
+
+
+

+ 258 - 0
src/components/SwiperBanner/SwiperBanner.vue

@@ -0,0 +1,258 @@
+<template>
+	<view class="detail-banner" :style="{height:bannerH/3.75+'vw'}">
+		<swiper :autoplay="autoPlay" :interval="4000" :duration="500" :circular="true" class="swiper-box"
+			:previous-margin="previousNext" :next-margin="previousNext" :snap-to-edge="true" @change="swiperChange"
+			v-if="bannerDetail.length">
+			<block v-for="(item,index) in bannerDetail" :key="index">
+				<swiper-item
+					:class="[bannerType=='3D'?(index === cur?'swiper-bigger':'swiper-smaller'):'','swiper-item']">
+					<image v-if="item.type === 1" mode="aspectFill" @click.stop="chooseSwiper(item)" :lazy-load="true"
+						:style="{borderRadius:radius/3.75+'vw'}"
+						:class="[bannerType=='3D'?(index === cur?'image-bigger':'image-smaller'):'banner-image']"
+						:src="item.url || item[imgKey].url" />
+					<video v-if="item.type === 2 && index === cur" mode="aspectFill" :lazy-load="true"
+						:style="{borderRadius:radius/3.75+'vw'}"
+						:class="[bannerType=='3D'?(index === cur?'image-bigger':'image-smaller'):'banner-image']"
+						:src="item.url || item[imgKey].url"></video>
+
+				</swiper-item>
+
+			</block>
+		</swiper>
+
+		<!--重置小圆点的样式  -->
+		<view class="dots" v-if="indicatorDots">
+			<view class="dots-bk" v-if="dotsType=='dot'">
+				<block v-for="(item,index) in bannerDetail.length" :key="index">
+					<view :class="{active: index == cur}"
+						:style="{backgroundColor:index == cur?indicatorColor:noIndicatorColor}" class="dot"></view>
+				</block>
+			</view>
+			<view class="dots-bk dots-bk1" v-if="dotsType=='digit'">
+				<view class="tag-wrap">
+					<text>{{cur+1+'/'+bannerDetail.length}}</text>
+				</view>
+			</view>
+
+		</view>
+		<!-- 收藏图标 -->
+		<!-- <slot name="collection"></slot> -->
+		<!--重置小圆点的样式 end -->
+
+		<!--  没有轮播时的默认图 -->
+		<!-- <image
+            wx:else="{{bannerDetail.length}}"
+            class="banner-image"
+            src="{{filters.imageFmt('good-default@2x')}}"
+        /> -->
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Emit,
+		Vue
+	} from "vue-property-decorator";
+
+	@Component({})
+	export default class swiperBanner extends Vue {
+		@Prop({
+			default: true
+		}) private indicatorDots! : boolean; // 是否自定义指示点
+		@Prop({
+			default: 'dot'
+		}) dotsType ?: string; // 自定义指示点样式 可选 dot / digit
+
+		@Prop({
+			default: true
+		}) private autoPlay ?: boolean; // 自动切换
+
+		@Prop({
+			default: () => []
+		}) bannerDetail! : any; // 轮播数据
+
+		@Prop({
+			default: 154
+		}) private bannerH! : number; // 轮播图高度
+
+		@Prop({
+			default: '#fff'
+		}) private indicatorColor ?: string; // 自定义指示点颜色
+
+		@Prop({
+			default: 'rgba(255,255,255,1)'
+		}) private noIndicatorColor ?: string; // 未选中指示点颜色
+
+		@Prop({
+			default: 0
+		}) private radius ?: number; // 自定义圆角 默认没有
+
+		@Prop({
+			default: false
+		}) private preview ?: boolean; // 开启预览图片 与点击跳转只可存在一个
+
+		@Prop() private bannerType ?: string; //轮播样式类型
+
+		@Prop({
+			default: "0rpx"
+		}) private previousNext ?: string; //前后轮播 缩进尺寸	
+
+		@Prop({
+			default: ""
+		}) private imgKey! : string // // 图片的字段
+
+		// options:{
+		//  //  开启具名插槽
+		//  multipleSlots: true ,
+
+		cur : number = 0 // 当前滑块的index
+		swiperChange(e : any) {
+			this.cur = e.detail.current //获取当前轮播图片的下标, 可以给当前指示点加样式
+			this.changeIndex(e.detail.current + 1);
+		}
+		//点击轮播
+		chooseSwiper(item : any) {
+			console.log(item)
+			if (this.preview) {
+				console.log(item)
+				let urls = this.bannerDetail.map((res: any) => res.url || res)
+				uni.previewImage({
+					current: item.url || item,
+					// loop: true,
+					urls,
+				})
+			} else {
+				this.changeSwiper(item)
+			}
+		}
+
+		@Emit('changeSwiper')
+		changeSwiper(val : any) {
+			return val
+		}
+		
+		@Emit('changeIndex')
+		changeIndex(val : any) {
+			return val
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	.detail-banner {
+		width: 100%;
+		position: relative;
+		// background: #d8d8d8;
+		overflow: hidden;
+
+		.swiper-box {
+			height: inherit;
+
+		}
+
+		.banner-image {
+			width: 100%;
+			height: 100%;
+		}
+	}
+
+	.swiper-item {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.swiper-bigger {
+		height: 100%
+	}
+
+	.swiper-smaller {
+		// height:80%
+		height: 100%
+	}
+
+	@keyframes Bigger {
+		from {
+			height: 80%
+		}
+
+		to {
+			height: 100%
+		}
+	}
+
+	@keyframes Smaller {
+		from {
+			height: 100%
+		}
+
+		to {
+			height: 80%
+		}
+	}
+
+	// 中间的轮播图
+	.image-bigger {
+		margin: 0 vw(10);
+		height: 100%;
+		width: 100%;
+		overflow: hidden;
+		// animation: Bigger 0.5s;
+		// -webkit-animation: heightChange 0.7s; /* Safari 与 Chrome */
+	}
+
+	// 两边的缩小的图片
+	.image-smaller {
+		height: 100%;
+		// animation: Smaller 0.5s;
+	}
+
+
+	.dots {
+		position: absolute;
+		bottom: vw(12);
+		height: vw(10);
+		width: 100%;
+		@include flex-x(center)
+	}
+
+	.dots-bk {
+		background: rgba(0, 0, 0, 0.1);
+		height: vw(10);
+		padding: 0 vw(3);
+		border-radius: vw(10);
+
+		@include flex-x() &.dots-bk1 {
+			background: none
+		}
+
+		// 指示点的第二种样式
+		.tag-wrap {
+			position: absolute;
+			right: vw(15);
+			background: #333;
+			color: #fff;
+			height: vw(20);
+			line-height: vw(20);
+			padding: vw(1) vw(10);
+			border-radius: vw(10);
+			font-size: vw(12);
+		}
+	}
+
+	/* 未选中时的小圆点样式 */
+	.dot {
+		margin-right: vw(8);
+		border-radius: vw(6);
+		height: vw(6);
+		width: vw(6);
+		margin: 0 vw(3)
+	}
+
+	/* 选中以后的小圆点样式 */
+	.active {
+		width: vw(12);
+	}
+</style>

+ 246 - 0
src/components/SwiperBanner1/SwiperBanner1.vue

@@ -0,0 +1,246 @@
+<template>
+	<view class="detail-banner" :style="{height:bannerH/3.75+'vw'}">
+		<swiper :autoplay="autoPlay" :interval="4000" :duration="500" :circular="true" class="swiper-box"
+			:previous-margin="previousNext" :next-margin="previousNext" :snap-to-edge="true" @change="swiperChange"
+			v-if="bannerDetail.length">
+			<block v-for="(item,index) in bannerDetail" :key="index">
+				<swiper-item
+					:class="[bannerType=='3D'?(index === cur?'swiper-bigger':'swiper-smaller'):'','swiper-item']">
+					<image mode="aspectFill" @tap.stop="chooseSwiper(item)" :lazy-load="true"
+						:style="{borderRadius:radius/3.75+'vw', display: 'block'}"
+						:class="[bannerType=='3D'?(index === cur?'image-bigger':'image-smaller'):'banner-image']"
+						:src="item[imgKey]||item" />
+
+				</swiper-item>
+
+			</block>
+		</swiper>
+
+		<!--重置小圆点的样式  -->
+		<view class="dots" v-if="indicatorDots">
+			<view class="dots-bk" v-if="dotsType=='dot'">
+				<block v-for="(item,index) in bannerDetail.length" :key="index">
+					<view :class="{active: index == cur}"
+						:style="{backgroundColor:index == cur?indicatorColor:noIndicatorColor}" class="dot"></view>
+				</block>
+			</view>
+			<view class="dots-bk dots-bk1" v-if="dotsType=='digit'">
+				<view class="tag-wrap">
+					<text>{{cur+1+'/'+bannerDetail.length}}</text>
+				</view>
+			</view>
+
+		</view>
+		<!-- 收藏图标 -->
+		<!-- <slot name="collection"></slot> -->
+		<!--重置小圆点的样式 end -->
+
+		<!--  没有轮播时的默认图 -->
+		<!-- <image
+            wx:else="{{bannerDetail.length}}"
+            class="banner-image"
+            src="{{filters.imageFmt('good-default@2x')}}"
+        /> -->
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Emit,
+		Vue
+	} from "vue-property-decorator";
+
+	@Component({})
+	export default class swiperBanner extends Vue {
+		@Prop({
+			default: true
+		}) private indicatorDots!: boolean; // 是否自定义指示点
+		@Prop({
+			default: 'dot'
+		}) dotsType ? : string; // 自定义指示点样式 可选 dot / digit
+
+		@Prop({
+			default: true
+		}) private autoPlay ? : boolean; // 自动切换
+
+		@Prop() bannerDetail!: Array < any > ; // 轮播数据
+
+		@Prop({
+			default: 154
+		}) private bannerH!: number; // 轮播图高度
+
+		@Prop({
+			default: '#fff'
+		}) private indicatorColor ? : string; // 自定义指示点颜色
+
+		@Prop({
+			default: 'rgba(255,255,255,1)'
+		}) private noIndicatorColor ? : string; // 未选中指示点颜色
+
+		@Prop({
+			default: 0
+		}) private radius ? : number; // 自定义圆角 默认没有
+
+		@Prop({
+			default: false
+		}) private preview ? : boolean; // 开启预览图片 与点击跳转只可存在一个
+
+		@Prop() private bannerType ? : string; //轮播样式类型
+
+		@Prop({
+			default: "0rpx"
+		}) private previousNext ? : string; //前后轮播 缩进尺寸	
+
+		@Prop({
+			default: ""
+		}) private imgKey!: string // // 图片的字段
+
+		// options:{
+		//  //  开启具名插槽
+		//  multipleSlots: true ,
+
+		cur: number = 0 // 当前滑块的index
+		swiperChange(e: any) {
+			this.cur = e.detail.current //获取当前轮播图片的下标, 可以给当前指示点加样式
+		}
+		//点击轮播
+		chooseSwiper(item: any) {
+			// console.log(item)
+			if (this.preview) {
+				let urls = this.bannerDetail.map(res => res[this.imgKey] || res)
+				uni.previewImage({
+					current: item[this.imgKey] || item,
+					loop: true,
+					urls,
+				})
+			} else {
+				this.changeSwiper(item)
+			}
+		}
+
+		@Emit('changeSwiper')
+		changeSwiper(val: any) {
+			return val
+		}
+
+	};
+</script>
+
+<style lang="scss" scoped>
+	.detail-banner {
+		width: 100%;
+		position: relative;
+		// background: #d8d8d8;
+		overflow: hidden;
+
+		.swiper-box {
+			height: inherit;
+
+		}
+
+		.banner-image {
+			width: 100%;
+			height: 100%;
+		}
+	}
+
+	.swiper-item {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.swiper-bigger {
+		height: 100%
+	}
+
+	.swiper-smaller {
+		// height:80%
+		height: 100%
+	}
+
+	@keyframes Bigger {
+		from {
+			height: 80%
+		}
+
+		to {
+			height: 100%
+		}
+	}
+
+	@keyframes Smaller {
+		from {
+			height: 100%
+		}
+
+		to {
+			height: 80%
+		}
+	}
+
+	// 中间的轮播图
+	.image-bigger {
+		margin: 0 vw(10);
+		height: 100%;
+		width: 100%;
+		overflow: hidden;
+		// animation: Bigger 0.5s;
+		// -webkit-animation: heightChange 0.7s; /* Safari 与 Chrome */
+	}
+
+	// 两边的缩小的图片
+	.image-smaller {
+		height: 100%;
+		// animation: Smaller 0.5s;
+	}
+
+
+	.dots {
+		position: absolute;
+		bottom: vw(12);
+		height: vw(10);
+		width: 100%;
+		@include flex-x(center)
+	}
+
+	.dots-bk {
+		background: rgba(0, 0, 0, 0.1);
+		height: vw(10);
+		padding: 0 vw(3);
+		border-radius: vw(10);
+
+		@include flex-x() &.dots-bk1 {
+			background: none
+		}
+
+		// 指示点的第二种样式
+		.tag-wrap {
+			position: absolute;
+			right: vw(15);
+			background: #333;
+			color: #fff;
+			height: vw(20);
+			line-height: vw(20);
+			padding: vw(1) vw(10);
+			border-radius: vw(10);
+			font-size: vw(12);
+		}
+	}
+
+	/* 未选中时的小圆点样式 */
+	.dot {
+		margin-right: vw(8);
+		border-radius: vw(6);
+		height: vw(6);
+		width: vw(6);
+		margin: 0 vw(3)
+	}
+
+	/* 选中以后的小圆点样式 */
+	.active {
+		width: vw(12);
+	}
+</style>

+ 137 - 0
src/components/TabBar/TabBar.vue

@@ -0,0 +1,137 @@
+<template>
+	<view class="tab-bar-box">
+		<view class="tab-bar">
+			<view v-for="(item, index) in list.slice(0, 5)" :key="index" class="tab-bar-item"
+				@click="switchTab(item, index)">
+				<IconText :color="tabBarIndex === index ? selectedColor : color" :size="24" v-show="tabBarIndex !== index  || item.text !== '首页'"
+					:code="tabBarIndex === index ? item.selectedIconPath : item.iconPath"></IconText>
+				<view class="view" :style="{ color: fontColor }" v-show="tabBarIndex !== index || item.text !== '首页'">
+					{{ item.text }}
+				</view>
+				<image :src="(staticUrl && item.pic) ? staticUrl + item.pic : ''" class="select-pic" mode="" v-show="tabBarIndex === index  && item.text === '首页'"></image>
+				<image class="pic" v-show="tabBarIndex === index" :src="img" mode="heightFix"></image>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script lang="ts">
+	import { Component, Vue } from 'vue-property-decorator';
+	import { namespace } from 'vuex-class';
+	const baseModule = namespace('base');
+	@Component({})
+	export default class TabBar extends Vue {
+		@baseModule.Getter('_tabBarIndex') tabBarIndex : any;
+		// selected: number | null = 0;
+		selectedColor : string = '#009360';
+		color : string = '#DBDBDB';
+		fontColor: string = '#9B9B9B';
+		staticUrl : string = this.$oss_url; //oss地址
+		list : object[] = [
+			{
+				pagePath: 'pages/front/front',
+				iconPath: '\ue8b8',
+				selectedIconPath: '\ue756',
+				pic: 'tabber-index.png',
+				text: '首页'
+			},
+			{
+				pagePath: 'pages/case/case',
+				iconPath: '\ue882',
+				selectedIconPath: '\ue882',
+				text: '案例'
+			},
+			{
+				pagePath: 'pages/local/local-life',
+				iconPath: '\ue87f',
+				selectedIconPath: '\ue87f',
+				text: '本地'
+			},
+			{
+				pagePath: 'pages/category/category',
+				iconPath: '\ue881',
+				selectedIconPath: '\ue881',
+				text: '分类'
+			},
+			{
+				pagePath: 'pages/user/user',
+				iconPath: '\ue884',
+				selectedIconPath: '\ue884',
+				text: '我的'
+			}
+		];
+		img: any = require('@/static/tabbar-img.png');
+		switchTab(item : any) : void {
+			const url = item.pagePath;
+			uni.switchTab({ url });
+		}
+	}
+</script>
+
+<style lang="scss">
+	.tab-bar-box{
+		width: 100%;
+		height: vw(95);
+		position: fixed;
+		z-index: 98;
+		left: 0;
+		bottom: 0;
+		@include flex-y(flex-end);
+		box-sizing: border-box;
+		overflow: hidden;
+		// box-shadow: 0px -1px 4px rgba(0, 0, 0, 0.08);
+	}
+	.tab-bar {
+		// width: 100%;
+		// height: vw(80);
+		// position: fixed;
+		// z-index: 98;
+		// left: 0;
+		// bottom: 0;
+		// @include flex-x();
+		// background: #fff;
+		// box-sizing: border-box;
+		// box-shadow: 0px -1px 4px rgba(0, 0, 0, 0.08);
+		width: 100%;
+		@include flex-x();
+		background: #fff;
+		height: vw(80);
+		border-top: 4px solid #E5E5E5;
+		box-sizing: border-box;
+
+		.tab-bar-item {
+			flex: 1;
+			text-align: center;
+			@include flex-y(center);
+			height: 100%;
+			// overflow: hidden;
+			position: relative;
+
+			.view {
+				font-size: 10px;
+				margin-top: 2px;
+				position: relative;
+
+				.yuan {
+					width: vw(8);
+					height: vw(8);
+					border-radius: vw(8);
+					background: $btn-color;
+					position: absolute;
+					top: vw(-25);
+					right: vw(-5);
+				}
+			}
+			.select-pic{
+				width: vw(60);
+				height: vw(60);
+			}
+			.pic{
+				height: vw(16);
+				top: vw(-16);
+				position: absolute;
+				// border-bottom: vw(1) solid #fff;
+			}
+		}
+	}
+</style>

+ 192 - 0
src/components/Tabs/Tabs.vue

@@ -0,0 +1,192 @@
+<template>
+	<scroll-view :scroll-x="true" scroll-with-animation="true" class="tabs"
+		:style="{background:bk,width:tabWidth/3.75+'vw'}" :scroll-left="scrollLeft">
+		<!-- 支持对象内传入keep(item.keep)   使得该选项保持常亮状态-->
+		<!-- 支持对象内传入icon(item.icon)   再次点击时 icon 旋转(item.rotate) ,点击其他选项,icon复位-->
+		<view :class="[{active:select==index||item.keep},'label']" :style="{
+				width:labelWidth+'vw',
+				fontSize:(select==index?activeSize:size)+'px',
+				color:(select==index||item.keep)?activeTextColor:textColor,
+				fontWeight:(select==index||item.keep)?bold:'400'
+			}" v-for="(item,index) in list" :key="index" @click.stop="selectTab(index,item)">
+			<text>{{ item.name }}</text>
+
+			<!-- 自定义图标  item.rotate为true 点击时图标翻转-->
+			<i class="tab-icon" v-if="item.icon" :class="{icon_rotate:item.rotate||false}" rotate>{{item.icon}}</i>
+			<!-- 竖分割线 -->
+			<view class="split-line" :style="{background:slineColor}" v-if="splitLine&&index!=list.length-1">
+			</view>
+		</view>
+		<view class="line" v-if="lineShow" :style="{transform:linWidth,background:lineColor}"></view>
+	</scroll-view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Vue,
+		Prop,
+		Watch,
+		Emit
+	} from 'vue-property-decorator'
+
+	@Component({})
+	export default class Tabs extends Vue {
+		select: number = 0;
+		@Prop({
+			default: 0
+		}) selectNum ? : number
+		@Prop() list!: []
+		@Prop({
+			default: 0
+		}) active!: number
+		@Prop({
+			default: 375
+		}) tabWidth!: string // tab 宽度
+		@Prop({
+			default: 14
+		}) activeSize!: number // 选中字体大小
+		@Prop({
+			default: 14
+		}) size!: number // 默认字体大小
+		@Prop({
+			default: '#999999'
+		}) textColor!: string // tab字体颜色
+		@Prop({
+			default: "#333333"
+		}) activeTextColor!: string // 选中tab字体颜色
+		@Prop({
+			default: '#CA4242'
+		}) lineColor!: string // 下划线颜色
+		@Prop({
+			default: '#eee'
+		}) slineColor!: string // 分割线
+		@Prop({
+			default: true
+		}) lineShow!: boolean //下划线是否显示
+		@Prop({
+			default: "#fff"
+		}) bk!: string // 背景
+		@Prop({
+			default: 400
+		}) bold!: number // 字体粗细
+		@Prop({
+			default: 4
+		}) fixedNum!: number // 全部展示的个数
+		@Prop({
+			default: 20
+		}) itemWidth!: number // 单个宽度  数量小于fixedNum个有效
+		@Prop({
+			default: false
+		}) isLoading!: boolean // 加载中禁止点击
+		@Prop({
+			default: false
+		}) splitLine!: boolean // 每两个中间加分割线
+
+
+		// computed---------------------------
+		get labelWidth() {
+			return this.list.length > this.fixedNum ? 20 : this.itemWidth;
+		}
+		get linWidth() {
+			// labelWidth比linewidth(8)大,line滑动中间需要要加上半个类似padding 的距离
+			return this.list.length > this.fixedNum ?
+				`translateX(${(this.select as any) * 20 + 4}vw)` :
+				`translateX(${(this.select as any) * this.itemWidth + (this.itemWidth - 8) / 2}vw)`;
+			// return `translateX(${(this.select as any) * this.itemWidth + (this.itemWidth - 8) / 2}vw)`;
+		}
+		get scrollLeft() {
+			return this.list.length > this.fixedNum ?
+				((this.select as any) - 2) * 20 * 3.75 :
+				((this.select as any) - 2) * this.itemWidth * 3.75;
+		}
+		// watch---------------------------
+		@Watch('active', {
+			immediate: true
+		})
+		activeChange(val: number) {
+			(this.select as any) = val
+		}
+
+		@Watch('selectNum', {
+			immediate: true,
+		})
+		clickNum() {
+			this.select = (this.selectNum as any);
+		}
+
+		// emit---------------------------
+		@Emit('clickTab')
+		selectTab(index: number, item ? : any) {
+			// 加载中禁止点击
+			// console.log('点击tab栏')
+			if (this.isLoading) return;
+			(this.select as any) = index;
+			return {
+				index,
+				item
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.tabs {
+		width: 100%;
+		height: 45px;
+		line-height: 45px;
+		padding: 0 vw(10);
+		box-sizing: border-box;
+		position: relative;
+		white-space: nowrap;
+		@include hide-scrollbar();
+		// border-top: vw(1) solid #f8f8f8;
+		// border-bottom: vw(1) solid #f8f8f8;
+
+		.line {
+			width: 8vw;
+			height: 5px;
+			border-radius: 10px;
+			position: absolute;
+			left: 0vw;
+			top: 37px;
+			transition: all 0.3s ease;
+		}
+
+		.label {
+			flex-shrink: 0;
+			@include ellipsis();
+			text-align: center;
+			display: inline-block;
+			transition: all 0.3s ease;
+			position: relative;
+
+			.split-line {
+				width: vw(2);
+				height: vw(25);
+				position: absolute;
+				right: 0;
+				top: vw(10);
+			}
+
+			.tab-icon {
+				@include icon(12, #999);
+				transition: all 0.3s ease;
+				display: inline-block;
+			}
+		}
+
+		// 旋转状态下
+		.label.active {
+			.tab-icon {
+				@include icon(12, $main-color);
+			}
+
+			// 旋转图标
+			.icon_rotate {
+				transform: rotate(180deg);
+				transition: all 0.3s ease;
+			}
+		}
+	}
+</style>

+ 28 - 0
src/components/gaoyia-parse/components/wxParseAudio.vue

@@ -0,0 +1,28 @@
+<template>
+	<!-- '<audio/>' 组件不再维护,建议使用能力更强的 'uni.createInnerAudioContext' 接口 有时间再改-->
+  <!--增加audio标签支持-->
+  <audio
+    :id="node.attr.id"
+    :class="node.classStr"
+    :style="node.styleStr"
+    :src="node.attr.src"
+    :loop="node.attr.loop"
+    :poster="node.attr.poster"
+    :name="node.attr.name"
+    :author="node.attr.author"
+    controls></audio>
+</template>
+
+<script>
+export default {
+  name: 'wxParseAudio',
+  props: {
+    node: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+};
+</script>

+ 94 - 0
src/components/gaoyia-parse/components/wxParseImg.vue

@@ -0,0 +1,94 @@
+<template>
+	<image
+		:mode="node.attr.mode"
+		:lazy-load="node.attr.lazyLoad"
+		:class="node.classStr"
+		:style="newStyleStr || node.styleStr"
+		:data-src="node.attr.src"
+		:src="node.attr.src"
+		@tap="wxParseImgTap"
+		@load="wxParseImgLoad"
+	/>
+</template>
+
+<script>
+export default {
+	name: 'wxParseImg',
+	data() {
+		return {
+			newStyleStr: '',
+			preview: true
+		};
+	},
+	inject: ['parseWidth'],
+	mounted() {},
+	props: {
+		node: {
+			type: Object,
+			default() {
+				return {};
+			}
+		}
+	},
+	
+	methods: {
+		wxParseImgTap(e) {
+			if (!this.preview) return;
+			const { src } = e.currentTarget.dataset;
+			if (!src) return;
+			let parent = this.$parent;
+			while (!parent.preview || typeof parent.preview !== 'function') {
+				// TODO 遍历获取父节点执行方法
+				parent = parent.$parent;
+			}
+			parent.preview(src, e);
+		},
+		// 图片视觉宽高计算函数区
+		wxParseImgLoad(e) {
+			const { src } = e.currentTarget.dataset;
+			if (!src) return;
+			let { width, height } = e.mp.detail;
+
+			const recal = this.wxAutoImageCal(width, height);
+
+			const { imageheight, imageWidth } = recal;
+			const { padding, mode } = this.node.attr;//删除padding
+			// const { mode } = this.node.attr;
+
+			const { styleStr } = this.node;
+			const imageHeightStyle = mode === 'widthFix' ? '' : `height: ${imageheight}px;`;
+
+			this.newStyleStr = `${styleStr}; ${imageHeightStyle}; width: ${imageWidth}px; padding: 0 ${+padding}px;`;//删除padding
+			// this.newStyleStr = `${styleStr}; ${imageHeightStyle}; width: ${imageWidth}px;`;
+		},
+		// 计算视觉优先的图片宽高
+		wxAutoImageCal(originalWidth, originalHeight) {
+			// 获取图片的原始长宽
+			const windowWidth = this.parseWidth.value;
+			const results = {};
+
+			if (originalWidth < 60 || originalHeight < 60) {
+				const { src } = this.node.attr;
+				let parent = this.$parent;
+				while (!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.removeImageUrl(src);
+				this.preview = false;
+			}
+
+			// 判断按照那种方式进行缩放
+			if (originalWidth > windowWidth) {
+				// 在图片width大于手机屏幕width时候
+				results.imageWidth = windowWidth;
+				results.imageheight = windowWidth * (originalHeight / originalWidth);
+			} else {
+				// 否则展示原来的数据
+				results.imageWidth = originalWidth;
+				results.imageheight = originalHeight;
+			}
+			return results;
+		}
+	}
+};
+</script>

+ 55 - 0
src/components/gaoyia-parse/components/wxParseTable.vue

@@ -0,0 +1,55 @@
+<template>
+	<div class='tablebox'>
+		<rich-text :nodes="nodes" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+	</div>
+</template>
+<script>
+export default {
+	name: 'wxParseTable',
+	props: {
+		node: {
+			type: Object,
+			default() {
+				return {};
+			},
+		},
+	},
+	inject: ['parseSelect'],
+	data() {
+		return {
+			nodes:[]
+		};
+	},
+	mounted() {
+		this.nodes=this.loadNode([this.node]);
+	},
+	methods: {
+		loadNode(node) {
+			let obj = [];
+			for (let children of node) {
+				if (children.node=='element') {
+					let t = {
+						name:children.tag,
+						attrs: {
+							class: children.classStr,
+							// style: children.styleStr,
+						},
+						children: children.nodes?this.loadNode(children.nodes):[]
+					}
+					
+					obj.push(t)
+				} else if(children.node=='text'){
+					obj.push({
+						type: 'text',
+						text: children.text
+					})
+				}
+			}
+			return obj
+		}
+	}
+};
+</script>
+<style>
+	@import url("../parse.css");
+</style>

+ 98 - 0
src/components/gaoyia-parse/components/wxParseTemplate0.vue

@@ -0,0 +1,98 @@
+<template>
+	<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node"/>
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text'">{{node.text}}</block>
+</template>
+
+<script>
+	// #ifdef APP-PLUS | H5
+	import wxParseTemplate from './wxParseTemplate0';
+	// #endif
+	// #ifdef MP
+	import wxParseTemplate from './wxParseTemplate1';
+	// #endif
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+
+	export default {
+		// #ifdef APP-PLUS | H5
+		name: 'wxParseTemplate',
+		// #endif
+		// #ifdef MP
+		name: 'wxParseTemplate0',
+		// #endif
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;// TODO currentTarget才有dataset
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {// TODO 遍历获取父节点执行方法
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate1.vue

@@ -0,0 +1,88 @@
+<template>
+	<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text'">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate2';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate1',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate10.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate11';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate10',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 86 - 0
src/components/gaoyia-parse/components/wxParseTemplate11.vue

@@ -0,0 +1,86 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<rich-text :nodes="node" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<rich-text :nodes="node" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<rich-text :nodes="node" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<rich-text :nodes="node" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate11',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate2.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text'">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate3';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate2',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate3.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate4';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate3',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate4.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate5';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate4',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate5.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate6';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate5',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate6.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate7';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate6',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate7.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate8';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate7',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate8.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate9';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate8',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
src/components/gaoyia-parse/components/wxParseTemplate9.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate10';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate9',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 15 - 0
src/components/gaoyia-parse/components/wxParseVideo.vue

@@ -0,0 +1,15 @@
+<template>
+  <!--增加video标签支持,并循环添加-->
+  <view :class="node.classStr" :style="node.styleStr">
+    <video :class="node.classStr" :style="node.styleStr" class="video-video" :src="node.attr.src"></video>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'wxParseVideo',
+  props: {
+    node: {},
+  },
+};
+</script>

+ 261 - 0
src/components/gaoyia-parse/libs/html2json.js

@@ -0,0 +1,261 @@
+/**
+ * html2Json 改造来自: https://github.com/Jxck/html2json
+ *
+ *
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ *               垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+
+import wxDiscode from './wxDiscode';
+import HTMLParser from './htmlparser';
+
+function makeMap(str) {
+  const obj = {};
+  const items = str.split(',');
+  for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
+  return obj;
+}
+
+// Block Elements - HTML 5
+const block = makeMap('br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
+
+// Inline Elements - HTML 5
+const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
+
+function removeDOCTYPE(html) {
+  const isDocument = /<body.*>([^]*)<\/body>/.test(html);
+  return isDocument ? RegExp.$1 : html;
+}
+
+function trimHtml(html) {
+  return html
+    .replace(/<!--.*?-->/gi, '')
+    .replace(/\/\*.*?\*\//gi, '')
+    .replace(/[ ]+</gi, '<')
+    .replace(/<script[^]*<\/script>/gi, '')
+    .replace(/<style[^]*<\/style>/gi, '');
+}
+
+function getScreenInfo() {
+  const screen = {};
+  wx.getSystemInfo({
+    success: (res) => {
+      screen.width = res.windowWidth;
+      screen.height = res.windowHeight;
+    },
+  });
+  return screen;
+}
+
+function html2json(html, customHandler, imageProp, host) {
+  // 处理字符串
+  html = removeDOCTYPE(html);
+  html = trimHtml(html);
+  html = wxDiscode.strDiscode(html);
+  // 生成node节点
+  const bufArray = [];
+  const results = {
+    nodes: [],
+    imageUrls: [],
+  };
+
+	const screen = getScreenInfo();
+  function Node(tag) {
+    this.node = 'element';
+    this.tag = tag;
+		
+		this.$screen = screen;
+  }
+
+  HTMLParser(html, {
+    start(tag, attrs, unary) {
+      // node for this element
+      const node = new Node(tag);
+
+      if (bufArray.length !== 0) {
+        const parent = bufArray[0];
+        if (parent.nodes === undefined) {
+          parent.nodes = [];
+        }
+      }
+
+      if (block[tag]) {
+        node.tagType = 'block';
+      } else if (inline[tag]) {
+        node.tagType = 'inline';
+      } else if (closeSelf[tag]) {
+        node.tagType = 'closeSelf';
+      }
+
+      node.attr = attrs.reduce((pre, attr) => {
+        const { name } = attr;
+        let { value } = attr;
+        if (name === 'class') {
+          node.classStr = value;
+        }
+        // has multi attibutes
+        // make it array of attribute
+        if (name === 'style') {
+          node.styleStr = value;
+        }
+        if (value.match(/ /)) {
+          value = value.split(' ');
+        }
+
+        // if attr already exists
+        // merge it
+        if (pre[name]) {
+          if (Array.isArray(pre[name])) {
+            // already array, push to last
+            pre[name].push(value);
+          } else {
+            // single value, make it array
+            pre[name] = [pre[name], value];
+          }
+        } else {
+          // not exist, put it
+          pre[name] = value;
+        }
+
+        return pre;
+      }, {});
+
+      // 优化样式相关属性
+      if (node.classStr) {
+        node.classStr += ` ${node.tag}`;
+      } else {
+        node.classStr = node.tag;
+      }
+      if (node.tagType === 'inline') {
+        node.classStr += ' inline';
+      }
+
+      // 对img添加额外数据
+      if (node.tag === 'img') {
+        let imgUrl = node.attr.src;
+        imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain);
+        Object.assign(node.attr, imageProp, {
+          src: imgUrl || '',
+        });
+        if (imgUrl) {
+          results.imageUrls.push(imgUrl);
+        }
+      }
+
+      // 处理a标签属性
+      if (node.tag === 'a') {
+        node.attr.href = node.attr.href || '';
+      }
+
+      // 处理font标签样式属性
+      if (node.tag === 'font') {
+        const fontSize = [
+          'x-small',
+          'small',
+          'medium',
+          'large',
+          'x-large',
+          'xx-large',
+          '-webkit-xxx-large',
+        ];
+        const styleAttrs = {
+          color: 'color',
+          face: 'font-family',
+          size: 'font-size',
+        };
+        if (!node.styleStr) node.styleStr = '';
+        Object.keys(styleAttrs).forEach((key) => {
+          if (node.attr[key]) {
+            const value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key];
+            node.styleStr += `${styleAttrs[key]}: ${value};`;
+          }
+        });
+      }
+
+      // 临时记录source资源
+      if (node.tag === 'source') {
+        results.source = node.attr.src;
+      }
+
+      if (customHandler.start) {
+        customHandler.start(node, results);
+      }
+
+      if (unary) {
+        // if this tag doesn't have end tag
+        // like <img src="hoge.png"/>
+        // add to parents
+        const parent = bufArray[0] || results;
+        if (parent.nodes === undefined) {
+          parent.nodes = [];
+        }
+        parent.nodes.push(node);
+      } else {
+        bufArray.unshift(node);
+      }
+    },
+    end(tag) {
+      // merge into parent tag
+      const node = bufArray.shift();
+      if (node.tag !== tag) {
+        console.error('invalid state: mismatch end tag');
+      }
+
+      // 当有缓存source资源时于于video补上src资源
+      if (node.tag === 'video' && results.source) {
+        node.attr.src = results.source;
+        delete results.source;
+      }
+
+      if (customHandler.end) {
+        customHandler.end(node, results);
+      }
+
+      if (bufArray.length === 0) {
+        results.nodes.push(node);
+      } else {
+        const parent = bufArray[0];
+        if (!parent.nodes) {
+          parent.nodes = [];
+        }
+        parent.nodes.push(node);
+      }
+    },
+    chars(text) {
+      if (!text.trim()) return;
+
+      const node = {
+        node: 'text',
+        text,
+      };
+
+      if (customHandler.chars) {
+        customHandler.chars(node, results);
+      }
+
+      if (bufArray.length === 0) {
+        results.nodes.push(node);
+      } else {
+        const parent = bufArray[0];
+        if (parent.nodes === undefined) {
+          parent.nodes = [];
+        }
+        parent.nodes.push(node);
+      }
+    },
+  });
+
+  return results;
+}
+
+export default html2json;

+ 156 - 0
src/components/gaoyia-parse/libs/htmlparser.js

@@ -0,0 +1,156 @@
+/**
+ *
+ * htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser
+ *
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ *               垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+// Regular Expressions for parsing tags and attributes
+
+const startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
+const endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
+const attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
+
+function makeMap(str) {
+  const obj = {};
+  const items = str.split(',');
+  for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
+  return obj;
+}
+
+// Empty Elements - HTML 5
+const empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr');
+
+// Block Elements - HTML 5
+const block = makeMap('address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
+
+// Inline Elements - HTML 5
+const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
+
+// Attributes that have their values filled in disabled="disabled"
+const fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected');
+
+function HTMLParser(html, handler) {
+  let index;
+  let chars;
+  let match;
+  let last = html;
+  const stack = [];
+
+  stack.last = () => stack[stack.length - 1];
+
+  function parseEndTag(tag, tagName) {
+    // If no tag name is provided, clean shop
+    let pos;
+    if (!tagName) {
+      pos = 0;
+    } else {
+      // Find the closest opened tag of the same type
+      tagName = tagName.toLowerCase();
+      for (pos = stack.length - 1; pos >= 0; pos -= 1) {
+        if (stack[pos] === tagName) break;
+      }
+    }
+    if (pos >= 0) {
+      // Close all the open elements, up the stack
+      for (let i = stack.length - 1; i >= pos; i -= 1) {
+        if (handler.end) handler.end(stack[i]);
+      }
+
+      // Remove the open elements from the stack
+      stack.length = pos;
+    }
+  }
+
+  function parseStartTag(tag, tagName, rest, unary) {
+    tagName = tagName.toLowerCase();
+
+    if (block[tagName]) {
+      while (stack.last() && inline[stack.last()]) {
+        parseEndTag('', stack.last());
+      }
+    }
+
+    if (closeSelf[tagName] && stack.last() === tagName) {
+      parseEndTag('', tagName);
+    }
+
+    unary = empty[tagName] || !!unary;
+
+    if (!unary) stack.push(tagName);
+
+    if (handler.start) {
+      const attrs = [];
+
+      rest.replace(attr, function genAttr(matches, name) {
+        const value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : '');
+
+        attrs.push({
+          name,
+          value,
+          escaped: value.replace(/(^|[^\\])"/g, '$1\\"'), // "
+        });
+      });
+
+      if (handler.start) {
+        handler.start(tagName, attrs, unary);
+      }
+    }
+  }
+
+  while (html) {
+    chars = true;
+
+    if (html.indexOf('</') === 0) {
+      match = html.match(endTag);
+
+      if (match) {
+        html = html.substring(match[0].length);
+        match[0].replace(endTag, parseEndTag);
+        chars = false;
+      }
+
+      // start tag
+    } else if (html.indexOf('<') === 0) {
+      match = html.match(startTag);
+
+      if (match) {
+        html = html.substring(match[0].length);
+        match[0].replace(startTag, parseStartTag);
+        chars = false;
+      }
+    }
+
+    if (chars) {
+      index = html.indexOf('<');
+      let text = '';
+      while (index === 0) {
+        text += '<';
+        html = html.substring(1);
+        index = html.indexOf('<');
+      }
+      text += index < 0 ? html : html.substring(0, index);
+      html = index < 0 ? '' : html.substring(index);
+
+      if (handler.chars) handler.chars(text);
+    }
+
+    if (html === last) throw new Error(`Parse Error: ${html}`);
+    last = html;
+  }
+
+  // Clean up any remaining tags
+  parseEndTag();
+}
+
+export default HTMLParser;

+ 209 - 0
src/components/gaoyia-parse/libs/wxDiscode.js

@@ -0,0 +1,209 @@
+// HTML 支持的数学符号
+function strNumDiscode(str) {
+str = str.replace(/&forall;|&#8704;|&#x2200;/g, '∀');
+str = str.replace(/&part;|&#8706;|&#x2202;/g, '∂');
+str = str.replace(/&exist;|&#8707;|&#x2203;/g, '∃');
+str = str.replace(/&empty;|&#8709;|&#x2205;/g, '∅');
+str = str.replace(/&nabla;|&#8711;|&#x2207;/g, '∇');
+str = str.replace(/&isin;|&#8712;|&#x2208;/g, '∈');
+str = str.replace(/&notin;|&#8713;|&#x2209;/g, '∉');
+str = str.replace(/&ni;|&#8715;|&#x220b;/g, '∋');
+str = str.replace(/&prod;|&#8719;|&#x220f;/g, '∏');
+str = str.replace(/&sum;|&#8721;|&#x2211;/g, '∑');
+str = str.replace(/&minus;|&#8722;|&#x2212;/g, '−');
+str = str.replace(/&lowast;|&#8727;|&#x2217;/g, '∗');
+str = str.replace(/&radic;|&#8730;|&#x221a;/g, '√');
+str = str.replace(/&prop;|&#8733;|&#x221d;/g, '∝');
+str = str.replace(/&infin;|&#8734;|&#x221e;/g, '∞');
+str = str.replace(/&ang;|&#8736;|&#x2220;/g, '∠');
+str = str.replace(/&and;|&#8743;|&#x2227;/g, '∧');
+str = str.replace(/&or;|&#8744;|&#x2228;/g, '∨');
+str = str.replace(/&cap;|&#8745;|&#x2229;/g, '∩');
+str = str.replace(/&cup;|&#8746;|&#x222a;/g, '∪');
+str = str.replace(/&int;|&#8747;|&#x222b;/g, '∫');
+str = str.replace(/&there4;|&#8756;|&#x2234;/g, '∴');
+str = str.replace(/&sim;|&#8764;|&#x223c;/g, '∼');
+str = str.replace(/&cong;|&#8773;|&#x2245;/g, '≅');
+str = str.replace(/&asymp;|&#8776;|&#x2248;/g, '≈');
+str = str.replace(/&ne;|&#8800;|&#x2260;/g, '≠');
+str = str.replace(/&le;|&#8804;|&#x2264;/g, '≤');
+str = str.replace(/&ge;|&#8805;|&#x2265;/g, '≥');
+str = str.replace(/&sub;|&#8834;|&#x2282;/g, '⊂');
+str = str.replace(/&sup;|&#8835;|&#x2283;/g, '⊃');
+str = str.replace(/&nsub;|&#8836;|&#x2284;/g, '⊄');
+str = str.replace(/&sube;|&#8838;|&#x2286;/g, '⊆');
+str = str.replace(/&supe;|&#8839;|&#x2287;/g, '⊇');
+str = str.replace(/&oplus;|&#8853;|&#x2295;/g, '⊕');
+str = str.replace(/&otimes;|&#8855;|&#x2297;/g, '⊗');
+str = str.replace(/&perp;|&#8869;|&#x22a5;/g, '⊥');
+str = str.replace(/&sdot;|&#8901;|&#x22c5;/g, '⋅');
+return str;
+}
+
+// HTML 支持的希腊字母
+function strGreeceDiscode(str) {
+str = str.replace(/&Alpha;|&#913;|&#x391;/g, 'Α');
+str = str.replace(/&Beta;|&#914;|&#x392;/g, 'Β');
+str = str.replace(/&Gamma;|&#915;|&#x393;/g, 'Γ');
+str = str.replace(/&Delta;|&#916;|&#x394;/g, 'Δ');
+str = str.replace(/&Epsilon;|&#917;|&#x395;/g, 'Ε');
+str = str.replace(/&Zeta;|&#918;|&#x396;/g, 'Ζ');
+str = str.replace(/&Eta;|&#919;|&#x397;/g, 'Η');
+str = str.replace(/&Theta;|&#920;|&#x398;/g, 'Θ');
+str = str.replace(/&Iota;|&#921;|&#x399;/g, 'Ι');
+str = str.replace(/&Kappa;|&#922;|&#x39a;/g, 'Κ');
+str = str.replace(/&Lambda;|&#923;|&#x39b;/g, 'Λ');
+str = str.replace(/&Mu;|&#924;|&#x39c;/g, 'Μ');
+str = str.replace(/&Nu;|&#925;|&#x39d;/g, 'Ν');
+str = str.replace(/&Xi;|&#925;|&#x39d;/g, 'Ν');
+str = str.replace(/&Omicron;|&#927;|&#x39f;/g, 'Ο');
+str = str.replace(/&Pi;|&#928;|&#x3a0;/g, 'Π');
+str = str.replace(/&Rho;|&#929;|&#x3a1;/g, 'Ρ');
+str = str.replace(/&Sigma;|&#931;|&#x3a3;/g, 'Σ');
+str = str.replace(/&Tau;|&#932;|&#x3a4;/g, 'Τ');
+str = str.replace(/&Upsilon;|&#933;|&#x3a5;/g, 'Υ');
+str = str.replace(/&Phi;|&#934;|&#x3a6;/g, 'Φ');
+str = str.replace(/&Chi;|&#935;|&#x3a7;/g, 'Χ');
+str = str.replace(/&Psi;|&#936;|&#x3a8;/g, 'Ψ');
+str = str.replace(/&Omega;|&#937;|&#x3a9;/g, 'Ω');
+
+str = str.replace(/&alpha;|&#945;|&#x3b1;/g, 'α');
+str = str.replace(/&beta;|&#946;|&#x3b2;/g, 'β');
+str = str.replace(/&gamma;|&#947;|&#x3b3;/g, 'γ');
+str = str.replace(/&delta;|&#948;|&#x3b4;/g, 'δ');
+str = str.replace(/&epsilon;|&#949;|&#x3b5;/g, 'ε');
+str = str.replace(/&zeta;|&#950;|&#x3b6;/g, 'ζ');
+str = str.replace(/&eta;|&#951;|&#x3b7;/g, 'η');
+str = str.replace(/&theta;|&#952;|&#x3b8;/g, 'θ');
+str = str.replace(/&iota;|&#953;|&#x3b9;/g, 'ι');
+str = str.replace(/&kappa;|&#954;|&#x3ba;/g, 'κ');
+str = str.replace(/&lambda;|&#955;|&#x3bb;/g, 'λ');
+str = str.replace(/&mu;|&#956;|&#x3bc;/g, 'μ');
+str = str.replace(/&nu;|&#957;|&#x3bd;/g, 'ν');
+str = str.replace(/&xi;|&#958;|&#x3be;/g, 'ξ');
+str = str.replace(/&omicron;|&#959;|&#x3bf;/g, 'ο');
+str = str.replace(/&pi;|&#960;|&#x3c0;/g, 'π');
+str = str.replace(/&rho;|&#961;|&#x3c1;/g, 'ρ');
+str = str.replace(/&sigmaf;|&#962;|&#x3c2;/g, 'ς');
+str = str.replace(/&sigma;|&#963;|&#x3c3;/g, 'σ');
+str = str.replace(/&tau;|&#964;|&#x3c4;/g, 'τ');
+str = str.replace(/&upsilon;|&#965;|&#x3c5;/g, 'υ');
+str = str.replace(/&phi;|&#966;|&#x3c6;/g, 'φ');
+str = str.replace(/&chi;|&#967;|&#x3c7;/g, 'χ');
+str = str.replace(/&psi;|&#968;|&#x3c8;/g, 'ψ');
+str = str.replace(/&omega;|&#969;|&#x3c9;/g, 'ω');
+str = str.replace(/&thetasym;|&#977;|&#x3d1;/g, 'ϑ');
+str = str.replace(/&upsih;|&#978;|&#x3d2;/g, 'ϒ');
+str = str.replace(/&piv;|&#982;|&#x3d6;/g, 'ϖ');
+str = str.replace(/&middot;|&#183;|&#xb7;/g, '·');
+return str;
+}
+
+function strcharacterDiscode(str) {
+// 加入常用解析
+
+// str = str.replace(/&nbsp;|&#32;|&#x20;/g, "&nbsp;");
+// str = str.replace(/&ensp;|&#8194;|&#x2002;/g, '&ensp;');
+// str = str.replace(/&#12288;|&#x3000;/g, '<span class=\'spaceshow\'> </span>');
+// str = str.replace(/&emsp;|&#8195;|&#x2003;/g, '&emsp;');
+// str = str.replace(/&quot;|&#34;|&#x22;/g, "\"");
+// str = str.replace(/&apos;|&#39;|&#x27;/g, "&apos;");
+// str = str.replace(/&acute;|&#180;|&#xB4;/g, "´");
+// str = str.replace(/&times;|&#215;|&#xD7;/g, "×");
+// str = str.replace(/&divide;|&#247;|&#xF7;/g, "÷");
+// str = str.replace(/&amp;|&#38;|&#x26;/g, '&amp;');
+// str = str.replace(/&lt;|&#60;|&#x3c;/g, '&lt;');
+// str = str.replace(/&gt;|&#62;|&#x3e;/g, '&gt;');
+
+
+
+
+str = str.replace(/&nbsp;|&#32;|&#x20;/g, "<span class='spaceshow'> </span>");
+str = str.replace(/&ensp;|&#8194;|&#x2002;/g, '<span class=\'spaceshow\'> </span>');
+str = str.replace(/&#12288;|&#x3000;/g, '<span class=\'spaceshow\'> </span>');
+str = str.replace(/&emsp;|&#8195;|&#x2003;/g, '<span class=\'spaceshow\'> </span>');
+str = str.replace(/&quot;|&#34;|&#x22;/g, "\"");
+str = str.replace(/&quot;|&#39;|&#x27;/g, "'");
+str = str.replace(/&acute;|&#180;|&#xB4;/g, "´");
+str = str.replace(/&times;|&#215;|&#xD7;/g, "×");
+str = str.replace(/&divide;|&#247;|&#xF7;/g, "÷");
+str = str.replace(/&amp;|&#38;|&#x26;/g, '&');
+str = str.replace(/&lt;|&#60;|&#x3c;/g, '<');
+str = str.replace(/&gt;|&#62;|&#x3e;/g, '>');
+return str;
+}
+
+// HTML 支持的其他实体
+function strOtherDiscode(str) {
+str = str.replace(/&OElig;|&#338;|&#x152;/g, 'Œ');
+str = str.replace(/&oelig;|&#339;|&#x153;/g, 'œ');
+str = str.replace(/&Scaron;|&#352;|&#x160;/g, 'Š');
+str = str.replace(/&scaron;|&#353;|&#x161;/g, 'š');
+str = str.replace(/&Yuml;|&#376;|&#x178;/g, 'Ÿ');
+str = str.replace(/&fnof;|&#402;|&#x192;/g, 'ƒ');
+str = str.replace(/&circ;|&#710;|&#x2c6;/g, 'ˆ');
+str = str.replace(/&tilde;|&#732;|&#x2dc;/g, '˜');
+str = str.replace(/&thinsp;|$#8201;|&#x2009;/g, '<span class=\'spaceshow\'> </span>');
+str = str.replace(/&zwnj;|&#8204;|&#x200C;/g, '<span class=\'spaceshow\'>‌</span>');
+str = str.replace(/&zwj;|$#8205;|&#x200D;/g, '<span class=\'spaceshow\'>‍</span>');
+str = str.replace(/&lrm;|$#8206;|&#x200E;/g, '<span class=\'spaceshow\'>‎</span>');
+str = str.replace(/&rlm;|&#8207;|&#x200F;/g, '<span class=\'spaceshow\'>‏</span>');
+str = str.replace(/&ndash;|&#8211;|&#x2013;/g, '–');
+str = str.replace(/&mdash;|&#8212;|&#x2014;/g, '—');
+str = str.replace(/&lsquo;|&#8216;|&#x2018;/g, '‘');
+str = str.replace(/&rsquo;|&#8217;|&#x2019;/g, '’');
+str = str.replace(/&sbquo;|&#8218;|&#x201a;/g, '‚');
+str = str.replace(/&ldquo;|&#8220;|&#x201c;/g, '“');
+str = str.replace(/&rdquo;|&#8221;|&#x201d;/g, '”');
+str = str.replace(/&bdquo;|&#8222;|&#x201e;/g, '„');
+str = str.replace(/&dagger;|&#8224;|&#x2020;/g, '†');
+str = str.replace(/&Dagger;|&#8225;|&#x2021;/g, '‡');
+str = str.replace(/&bull;|&#8226;|&#x2022;/g, '•');
+str = str.replace(/&hellip;|&#8230;|&#x2026;/g, '…');
+str = str.replace(/&permil;|&#8240;|&#x2030;/g, '‰');
+str = str.replace(/&prime;|&#8242;|&#x2032;/g, '′');
+str = str.replace(/&Prime;|&#8243;|&#x2033;/g, '″');
+str = str.replace(/&lsaquo;|&#8249;|&#x2039;/g, '‹');
+str = str.replace(/&rsaquo;|&#8250;|&#x203a;/g, '›');
+str = str.replace(/&oline;|&#8254;|&#x203e;/g, '‾');
+str = str.replace(/&euro;|&#8364;|&#x20ac;/g, '€');
+str = str.replace(/&trade;|&#8482;|&#x2122;/g, '™');
+str = str.replace(/&larr;|&#8592;|&#x2190;/g, '←');
+str = str.replace(/&uarr;|&#8593;|&#x2191;/g, '↑');
+str = str.replace(/&rarr;|&#8594;|&#x2192;/g, '→');
+str = str.replace(/&darr;|&#8595;|&#x2193;/g, '↓');
+str = str.replace(/&harr;|&#8596;|&#x2194;/g, '↔');
+str = str.replace(/&crarr;|&#8629;|&#x21b5;/g, '↵');
+str = str.replace(/&lceil;|&#8968;|&#x2308;/g, '⌈');
+str = str.replace(/&rceil;|&#8969;|&#x2309;/g, '⌉');
+str = str.replace(/&lfloor;|&#8970;|&#x230a;/g, '⌊');
+str = str.replace(/&rfloor;|&#8971;|&#x230b;/g, '⌋');
+str = str.replace(/&loz;|&#9674;|&#x25ca;/g, '◊');
+str = str.replace(/&spades;|&#9824;|&#x2660;/g, '♠');
+str = str.replace(/&clubs;|&#9827;|&#x2663;/g, '♣');
+str = str.replace(/&hearts;|&#9829;|&#x2665;/g, '♥');
+str = str.replace(/&diams;|&#9830;|&#x2666;/g, '♦');
+return str;
+}
+
+function strDiscode(str) {
+  str = strNumDiscode(str);
+  str = strGreeceDiscode(str);
+  str = strcharacterDiscode(str);
+  str = strOtherDiscode(str);
+  return str;
+}
+
+function urlToHttpUrl(url, domain) {
+  if (/^\/\//.test(url)) {
+    return `https:${url}`;
+  } else if (/^\//.test(url)) {
+    return `https://${domain}${url}`;
+  }
+  return url;
+}
+
+export default {
+  strDiscode,
+  urlToHttpUrl,
+};

+ 258 - 0
src/components/gaoyia-parse/parse.css

@@ -0,0 +1,258 @@
+/**
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ *         垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+/**
+ * 请在全局下引入该文件,@import '/static/wxParse.css';
+ */
+.wxParse {
+	user-select:none;
+	width: 100%;
+	font-family: Helvetica, "PingFangSC", 'Microsoft Yahei', '微软雅黑', Arial, sans-serif;
+	color: #333;
+	line-height: 1.5;
+	font-size: 1em;
+	text-align:justify;/* //左右两端对齐 */
+}
+.wxParse view ,.wxParse uni-view{
+	word-break: break-word;
+}
+.wxParse .p {
+	padding-bottom: 0.5em;
+	clear: both;
+	/* letter-spacing: 0;//字间距 */
+}
+.wxParse .inline {
+  display: inline;
+  margin: 0;
+  padding: 0;
+}
+
+.wxParse .div {
+  margin: 0;
+  padding: 0;
+  display: block;
+}
+
+.wxParse .h1{
+  font-size: 2em;
+  line-height: 1.2em;
+  margin: 0.67em 0;
+}
+.wxParse .h2{
+  font-size: 1.5em;
+  margin: 0.83em 0;
+}
+.wxParse .h3{
+  font-size: 1.17em;
+  margin: 1em 0;
+}
+.wxParse .h4{
+  margin: 1.33em 0;
+}
+.wxParse .h5{
+  font-size: 0.83em;
+  margin: 1.67em 0;
+}
+.wxParse .h6{
+  font-size: 0.83em;
+  margin: 1.67em 0;
+}
+
+.wxParse .h1,
+.wxParse .h2,
+.wxParse .h3,
+.wxParse .h4,
+.wxParse .h5,
+.wxParse .h6,
+.wxParse .b,
+.wxParse .strong{
+  font-weight: bolder;
+}
+
+.wxParse .i,
+.wxParse .cite,
+.wxParse .em,
+.wxParse .var,
+.wxParse .address {
+  font-style: italic;
+}
+.wxParse .spaceshow{
+	  white-space: pre;
+}
+.wxParse .pre,
+.wxParse .tt,
+.wxParse .code,
+.wxParse .kbd,
+.wxParse .samp {
+  font-family: monospace;
+}
+.wxParse .pre {
+  overflow: auto;
+  background: #f5f5f5;
+  padding: 16upx;
+  white-space: pre;
+  margin: 1em 0upx;
+  font-size: 24upx;
+}
+.wxParse .code {
+	overflow: auto;
+	padding: 16upx;
+	white-space: pre;
+	margin: 1em 0upx;
+	background: #f5f5f5;
+	font-size: 24upx;
+}
+
+.wxParse .big {
+  font-size: 1.17em;
+}
+
+.wxParse .small,
+.wxParse .sub,
+.wxParse .sup {
+  font-size: 0.83em;
+}
+
+.wxParse .sub {
+  vertical-align: sub;
+}
+.wxParse .sup {
+  vertical-align: super;
+}
+
+.wxParse .s,
+.wxParse .strike,
+.wxParse .del {
+  text-decoration: line-through;
+}
+
+.wxParse .strong,
+.wxParse .text,
+.wxParse .span,
+.wxParse .s {
+  display: inline;
+}
+
+.wxParse .a {
+  color: deepskyblue;
+}
+
+.wxParse .video {
+  text-align: center;
+  margin: 22upx 0;
+}
+
+.wxParse .video-video {
+  width: 100%;
+}
+.wxParse .uni-image{
+	max-width: 100%;
+}
+.wxParse .img {
+  display: block;
+  max-width: 100%;
+  margin-bottom: 0em;/* //与p标签底部padding同时修改 */
+  overflow: hidden;
+}
+
+.wxParse .blockquote {
+  margin: 10upx 0;
+  padding: 22upx 0 22upx 22upx;
+  font-family: Courier, Calibri, "宋体";
+  background: #f5f5f5;
+  border-left: 6upx solid #dbdbdb;
+}
+.wxParse .blockquote .p {
+  margin: 0;
+}
+.wxParse .ul, .wxParse .ol {
+  display: block;
+  margin: 1em 0;
+  padding-left: 2em;
+}
+.wxParse .ol {
+  list-style-type: disc;
+}
+.wxParse .ol {
+  list-style-type: decimal;
+}
+.wxParse .ol>weixin-parse-template,.wxParse .ul>weixin-parse-template {
+  display: list-item;
+  align-items: baseline;
+  text-align: match-parent;
+}
+
+.wxParse .ol>.li,.wxParse .ul>.li {
+  display: list-item;
+  align-items: baseline;
+  text-align: match-parent;
+}
+.wxParse .ul .ul, .wxParse .ol .ul {
+  list-style-type: circle;
+}
+.wxParse .ol .ol .ul, .wxParse .ol .ul .ul, .wxParse .ul .ol .ul, .wxParse .ul .ul .ul {
+    list-style-type: square;
+}
+
+.wxParse .u {
+  text-decoration: underline;
+}
+.wxParse .hide {
+  display: none;
+}
+.wxParse .del {
+  display: inline;
+}
+.wxParse .figure {
+  overflow: hidden;
+}
+.wxParse .tablebox{
+	overflow: auto;
+	background-color: #f5f5f5;
+	background: #f5f5f5;
+	font-size: 13px;
+	padding: 8px;
+}
+.wxParse .table .table,.wxParse .table{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	/* 内边框 */
+	/* width: 100%; */
+	overflow: auto;
+	white-space: pre;
+}
+.wxParse .tbody{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	/* 内边框 */
+	border: 1px solid #dadada;
+}
+.wxParse .table  .thead, .wxParse  .table .tfoot, .wxParse  .table .th{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	background: #ececec;
+	font-weight: 40;
+}
+.wxParse  .table .tr {
+	border-collapse:collapse;
+	box-sizing: border-box;
+	/* border: 2px solid #F0AD4E; */
+	overflow:auto;
+}
+.wxParse  .table .th,
+.wxParse  .table .td{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	border: 2upx solid #dadada;
+	overflow:auto;
+}
+.wxParse .audio, .wxParse .uni-audio-default{
+	display: block;
+}

+ 228 - 0
src/components/gaoyia-parse/parse.vue

@@ -0,0 +1,228 @@
+<!--**
+ * forked from:https://github.com/F-loat/mpvue-wxParse
+ *
+ * github地址: https://github.com/dcloudio/uParse
+ *
+ * for: uni-app框架下 富文本解析
+ * 
+ * 优化 by gaoyia@qq.com  https://github.com/gaoyia/parse
+ */-->
+
+<template>
+	
+	<!--基础元素-->
+	<div class="wxParse" :class="className" :style="'user-select:' + userSelect">
+		<block v-for="(node, index) of nodes" :key="index" v-if="!loading">
+			<wxParseTemplate :node="node" />
+		</block>
+	</div>
+</template>
+
+<script>
+import HtmlToJson from './libs/html2json';
+import wxParseTemplate from './components/wxParseTemplate0';
+
+	
+	export default {
+		name: 'wxParse',
+		props: {
+			// user-select:none;
+			userSelect: {
+				type: String,
+				default: 'text' //none |text| all | element
+			},
+			imgOptions: {
+				type: [Object, Boolean],
+				default: function() {
+					return {
+						loop: false,
+						indicator: 'number',
+						longPressActions: false
+						// longPressActions: {
+						// 	 itemList: ['发送给朋友', '保存图片', '收藏'],
+						// 		success: function (res) {
+						// 			console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
+						// 		},
+						// 		fail: function (res) {
+						// 			console.log(res.errMsg);
+						// 		}    
+						// 	}
+						// }
+					}
+				}
+			},
+			loading: {
+				type: Boolean,
+				default: false
+			},
+			className: {
+				type: String,
+				default: ''
+			},
+			content: {
+				type: String,
+				default: ''
+			},
+			noData: {
+				type: String,
+				default: '<div style="color: red;">数据不能为空</div>'
+			},
+			startHandler: {
+				type: Function,
+				default () {
+					return node => {
+						node.attr.class = null;
+						node.attr.style = null;
+					};
+				}
+			},
+			endHandler: {
+				type: Function,
+				default: null
+			},
+			charsHandler: {
+				type: Function,
+				default: null
+			},
+			imageProp: {
+				type: Object,
+				default () {
+					return {
+						mode: 'aspectFit',
+						padding: 0,
+						lazyLoad: false,
+						domain: ''
+					};
+				}
+			}
+		},
+		components: {
+			wxParseTemplate
+		},
+		data() {
+			return {
+				nodes: {},
+				imageUrls: [],
+				wxParseWidth: {
+					value: 0
+				}
+			};
+		},
+		computed: {},
+		mounted() {
+			this.setHtml()
+		},
+		methods: {
+			setHtml() {
+				this.getWidth().then((data) => {
+					this.wxParseWidth.value = data;
+				})
+				let {
+					content,
+					noData,
+					imageProp,
+					startHandler,
+					endHandler,
+					charsHandler
+				} = this;
+				let parseData = content || noData;
+				let customHandler = {
+					start: startHandler,
+					end: endHandler,
+					chars: charsHandler
+				};
+				let results = HtmlToJson(parseData, customHandler, imageProp, this);
+
+				this.imageUrls = results.imageUrls;
+				// this.nodes = results.nodes;
+				
+				
+				this.nodes = [];
+				results.nodes.forEach((item) => {
+					setTimeout(() => {
+						this.nodes.push(item)
+					}, 0);
+				})
+			},
+			getWidth() {
+				return new Promise((res, rej) => {
+					// #ifndef MP-ALIPAY || MP-BAIDU
+					uni.createSelectorQuery()
+						.in(this)
+						.select('.wxParse')
+						.fields({
+								size: true,
+								scrollOffset: true
+							},
+							data => {
+								res(data.width);
+							}
+						).exec();
+					// #endif
+					// #ifdef MP-BAIDU
+					const query = swan.createSelectorQuery();
+					query.select('.wxParse').boundingClientRect();
+					query.exec(obj => {
+						const rect = obj[0]
+						if (rect) {
+							res(rect.width);
+						}
+					});
+					// #endif
+					// #ifdef MP-ALIPAY
+					my.createSelectorQuery()
+						.select('.wxParse')
+						.boundingClientRect().exec((ret) => {
+							res(ret[0].width);
+						});
+					// #endif
+				});
+			},
+			navigate(href, $event, attr) {
+				console.log(href, attr);
+				this.$emit('navigate', href, $event);
+			},
+			preview(src, $event) {
+				if (!this.imageUrls.length || typeof this.imgOptions === 'boolean') {
+
+				} else {
+					uni.previewImage({
+						current: src,
+						urls: this.imageUrls,
+						loop: this.imgOptions.loop,
+						indicator: this.imgOptions.indicator,
+						longPressActions: this.imgOptions.longPressActions
+					});
+				}
+				this.$emit('preview', src, $event);
+			},
+			removeImageUrl(src) {
+				const {
+					imageUrls
+				} = this;
+				imageUrls.splice(imageUrls.indexOf(src), 1);
+			}
+		},
+		// 父组件中提供
+		provide() {
+			return {
+				parseWidth: this.wxParseWidth,
+				parseSelect: this.userSelect
+				// 提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。
+			};
+		},
+		watch: {
+			content(){
+				this.setHtml()
+			}
+			// content: {
+			// 	handler: function(newVal, oldVal) {
+			// 		if (newVal !== oldVal) {
+			// 			
+			// 		}
+			// 	},
+			// 	deep: true
+			// }
+		}
+	};
+</script>

+ 21 - 0
src/main.ts

@@ -0,0 +1,21 @@
+import Vue from 'vue'
+import App from './App.vue'
+import {router, RouterMount} from '@/router/index.ts'  
+import store from '@/common/store'
+import MyHttp from '@/common/http';
+import {OSS_STATIC} from '@/common/constants';
+Vue.prototype.$oss_url = OSS_STATIC;
+Vue.use(router);
+Vue.use(MyHttp)
+Vue.config.productionTip = false
+const app = new Vue({
+    ...App,
+		store,
+})
+// #ifdef H5
+	RouterMount(app,router,'#app')
+// #endif
+
+// #ifndef H5
+	app.$mount(); //为了兼容小程序及app端必须这样写才有效果
+// #endif

+ 308 - 0
src/manifest.json

@@ -0,0 +1,308 @@
+{
+    "name" : "全养家居",
+    "appid" : "__UNI__BE0CB7D",
+    "description" : "",
+    "versionName" : "1.0.22",
+    "versionCode" : 122,
+    "transformPx" : false,
+    "app-plus" : {
+        /* 5+App特有相关 */
+        "modules" : {
+            "Maps" : {},
+            "VideoPlayer" : {},
+            "Camera" : {},
+            "Push" : {},
+            "Share" : {},
+            "Payment" : {},
+            "Barcode" : {}
+        },
+        "compatible" : {
+            "ignoreVersion" : true
+        },
+        /* 模块配置 */
+        "distribute" : {
+            /* 应用发布信息 */
+            "android" : {
+                /* android打包配置 */
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ],
+                "minSdkVersion" : 21
+            },
+            "ios" : {
+                "dSYMs" : false
+            },
+            /* ios打包配置 */
+            "sdkConfigs" : {
+                "ad" : {},
+                "maps" : {
+                    "amap" : {
+                        "name" : "amapkomHnB6e",
+                        "appkey_ios" : "7667ff4e755c0785557b456d61e38e8c",
+                        "appkey_android" : "7667ff4e755c0785557b456d61e38e8c"
+                    }
+                },
+                "geolocation" : {},
+                "push" : {},
+                "share" : {
+                    "weixin" : {
+                        "appid" : "wxbb87cb30503f9822",
+                        "UniversalLinks" : ""
+                    }
+                },
+                "payment" : {
+                    "weixin" : {
+                        "__platform__" : [ "ios", "android" ],
+                        "appid" : "wxbb87cb30503f9822",
+                        "UniversalLinks" : ""
+                    }
+                }
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            }
+        },
+        /* SDK配置 */
+        "usingComponents" : true,
+        "nativePlugins" : {
+            "SandPayTypeModule" : {
+                "jumpScheme_host" : "xxx",
+                "__plugin_info__" : {
+                    "name" : "SandPayTypeModule",
+                    "description" : "全支付收银台安卓原生插件",
+                    "platforms" : "Android",
+                    "url" : "",
+                    "android_package_name" : "",
+                    "ios_bundle_id" : "",
+                    "isCloud" : false,
+                    "bought" : -1,
+                    "pid" : "",
+                    "parameters" : {
+                        "jumpScheme_host" : {
+                            "des" : "",
+                            "key" : "",
+                            "value" : ""
+                        }
+                    }
+                }
+            },
+            "Aliyun-Push" : {
+                "阿里云移动推送Android AppKey" : "334589308",
+                "阿里云移动推送Android AppSecret" : "647d9769e02e4d6f9b5d95bba4b3777f",
+                "阿里云移动推送iOS AppKey" : "",
+                "阿里云移动推送iOS AppSecret" : "",
+                "__plugin_info__" : {
+                    "name" : "阿里云移动推送",
+                    "description" : "移动推送(Mobile Push)是提供给移动开发者的移动端消息推送服务,通过在App中集成推送功能,进行高效、精准、实时的消息推送,从而使业务及时触达用户,提高用户粘性。",
+                    "platforms" : "Android,iOS",
+                    "url" : "https://ext.dcloud.net.cn/plugin?id=7628",
+                    "android_package_name" : "com.uniit.qyjj.uni258",
+                    "ios_bundle_id" : "",
+                    "isCloud" : true,
+                    "bought" : 1,
+                    "pid" : "7628",
+                    "parameters" : {
+                        "阿里云移动推送Android AppKey" : {
+                            "des" : "阿里云EMAS移动应用标识",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "阿里云移动推送Android AppSecret" : {
+                            "des" : "阿里云EMAS移动应用密钥",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "阿里云移动推送iOS AppKey" : {
+                            "des" : "阿里云EMAS移动应用标识",
+                            "key" : "aliyun:push:appKey",
+                            "value" : ""
+                        },
+                        "阿里云移动推送iOS AppSecret" : {
+                            "des" : "阿里云EMAS移动应用密钥",
+                            "key" : "aliyun:push:appSecret",
+                            "value" : ""
+                        }
+                    }
+                }
+            },
+            "Aliyun-ThirdPush" : {
+                "com.gcm.push.apiKey" : "",
+                "com.gcm.push.applicationid" : "",
+                "com.gcm.push.projectid" : "",
+                "com.gcm.push.sendid" : "",
+                "com.hihonor.push.app_id" : "",
+                "com.huawei.hms.client.appid" : "",
+                "com.meizu.push.id" : "",
+                "com.meizu.push.key" : "",
+                "com.oppo.push.key" : "",
+                "com.oppo.push.secret" : "",
+                "com.vivo.push.api_key" : "",
+                "com.vivo.push.app_id" : "",
+                "com.xiaomi.push.id" : "",
+                "com.xiaomi.push.key" : "",
+                "__plugin_info__" : {
+                    "name" : "阿里云移动推送-厂商通道",
+                    "description" : "移动推送(Mobile Push)是提供给移动开发者的移动端消息推送服务,通过在App中集成推送功能,进行高效、精准、实时的消息推送,从而使业务及时触达用户,提高用户粘性。厂商通道是使用手机厂商提供的",
+                    "platforms" : "Android",
+                    "url" : "https://ext.dcloud.net.cn/plugin?id=7629",
+                    "android_package_name" : "com.uniit.qyjj.uni258",
+                    "ios_bundle_id" : "",
+                    "isCloud" : true,
+                    "bought" : 1,
+                    "pid" : "7629",
+                    "parameters" : {
+                        "com.gcm.push.apiKey" : {
+                            "des" : "gcm推送apiKey",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.gcm.push.applicationid" : {
+                            "des" : "gcm推送applicationId",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.gcm.push.projectid" : {
+                            "des" : "gcm推送projectid",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.gcm.push.sendid" : {
+                            "des" : "gcm推送sendId",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.hihonor.push.app_id" : {
+                            "des" : "荣耀推送AppId",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.huawei.hms.client.appid" : {
+                            "des" : "华为推送AppId",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.meizu.push.id" : {
+                            "des" : "魅族推送ID",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.meizu.push.key" : {
+                            "des" : "魅族推送Key",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.oppo.push.key" : {
+                            "des" : "Oppo推送Key",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.oppo.push.secret" : {
+                            "des" : "Oppo推送密钥",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.vivo.push.api_key" : {
+                            "des" : "vivo推送Api Key",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.vivo.push.app_id" : {
+                            "des" : "vivo推送App Id",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.xiaomi.push.id" : {
+                            "des" : "小米推送ID",
+                            "key" : "",
+                            "value" : ""
+                        },
+                        "com.xiaomi.push.key" : {
+                            "des" : "小米推送Key",
+                            "key" : "",
+                            "value" : ""
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "quickapp" : {},
+    /* 快应用特有相关 */
+    "mp-weixin" : {
+        /* 小程序特有相关 */
+        "usingComponents" : true,
+        "appid" : "wx498dbf62b48d553c",
+        "setting" : {
+            "urlCheck" : true,
+            "minified" : true
+        },
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "你的位置信息将用于小程序位置接口的效果展示"
+            }
+        },
+        "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ]
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "mp-qq" : {
+        "usingComponents" : true
+    }
+}

+ 105 - 0
src/packages/classroom/classroom-detail.vue

@@ -0,0 +1,105 @@
+<template>
+	<view class="classroom-box">
+		<Navbar title="文章详情" background-color="#fff" color="#333"></NavBar>
+		<view class="container">
+			<view class="title">{{info.title}}</view>
+			<view class="date">{{info.created}}</view>
+			<!-- <view class="text" v-html="info.content"></view> -->
+			<u-parse :content="info.content" @preview="preview" @navigate="navigate" />
+		</view>
+	</view>
+</template>
+
+<script lang='ts'>
+	import uParse from '@/components/gaoyia-parse/parse.vue'
+	import {
+		Component,
+		Vue
+	} from 'vue-property-decorator';
+	@Component({
+		components: {
+			uParse
+		},
+		filters: {
+			moneyFormat(val: any) {
+				if (!+val) return '0.00';
+				return (+val).toFixed(2);
+			}
+		}
+	})
+	export default class Classroom extends Vue {
+		info: any = '';
+
+		onShow() {
+			this.getClassroomInfo();
+		}
+
+		preview(src: any, e: any) {
+			// do something
+		}
+		navigate(href: any, e: any) {
+			// console.log(href, 123);
+			// do something
+			this.$Router.push({
+				path: '/pages/front/article',
+				query: {
+					link: href
+				}
+			})
+		}
+
+		getClassroomInfo() {
+			this.$http
+				.get({
+					url: this.$api.getClassroomInfo,
+					data: {
+						id: this.$Route.query.id
+					}
+				})
+				.then((res: any) => {
+					this.info = res;
+				}, (err: any) => {
+					console.log(err);
+				});
+		}
+	}
+</script>
+<style lang='scss'>
+	.video {
+		@include flex-y(center);
+	}
+</style>
+<style lang='scss' scoped>
+	page {
+		background: #fff;
+	}
+
+	.classroom-box {
+		min-height: 100vh;
+		@include flex-y();
+		background: #fff;
+
+		.container {
+			flex: 1;
+			width: 100%;
+			box-sizing: border-box;
+			overflow-y: auto;
+			padding: 0 vw(18);
+
+			.title {
+				@include word-vw(24, #333);
+				margin-top: vw(30);
+				font-weight: 550;
+			}
+
+			.date {
+				@include word-vw(12, #999);
+				margin-top: vw(24);
+			}
+
+			.text {
+				margin-top: vw(24);
+			}
+		}
+	}
+</style>

+ 271 - 0
src/packages/classroom/classroom-list.vue

@@ -0,0 +1,271 @@
+<template>
+	<view class="classroom-box">
+		<Navbar title="云课堂" background-color="#fff" color="#333"></NavBar>
+		<view class="container">
+			<image class="pic" :src="info.pic" mode="aspectFill"></image>
+			<view class="pic-box2">
+				<image class="pic2" :src="static ? static + 'classroom-bg.png' : ''" mode="widthFix"></image>
+			</view>
+			<view class="tab-box">
+				<scroll-view class="tabs" scroll-x>
+					<view class="tab" :class="{active: sortId === item.id}" v-for="(item, index) in calssList"
+						:key="item.id" @click="changeTab(item.id)">
+						{{item.name}}
+						<view class="bar"></view>
+					</view>
+				</scroll-view>
+			</view>
+			<view class="goods" v-if="list.length">
+				<view class="item" v-for="item in list" :key="item.id" @click="toDetail(item.id)">
+					<image class="pic" :src="item.pic" mode="aspectFill"></image>
+					<view class="name">{{item.title}}</view>
+				</view>
+				<view class="data-tips">
+					<text v-if="finish">没有更多了</text>
+					<text v-else>加载更多</text>
+				</view>
+			</view>
+			<view class="noData" v-if="!list.length && !loading">
+				<NoData :show="!list.length" topNum="10"></NoData>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script lang='ts'>
+	import {
+		Component,
+		Vue
+	} from 'vue-property-decorator';
+	import {
+		OSS_STATIC,
+		// PHONENNUMBER,
+		// EMAIL,
+		// APP_BASE_URL
+	} from '@/common/constants';
+	@Component({
+		filters: {
+			moneyFormat(val: any) {
+				if (!+val) return '0.00';
+				return (+val).toFixed(2);
+			}
+		}
+	})
+	export default class Classroom extends Vue {
+		info: any = '';
+		calssList: any = [];
+		static : string = OSS_STATIC;
+		list: any = [];
+		sortId: any = null;
+		loading: any = false;
+		finish: any = false;
+		size: any = 10;
+		current: any = 1;
+
+		onLoad() {
+			this.getClassroomPosterInfo();
+			this.getCategoryList();
+		}
+		
+		onReachBottom() {
+			console.log(123);
+			if (this.finish) return;
+			this.current++;
+			this.sortId && this.getList(this.sortId);
+		}
+
+		getClassroomPosterInfo() {
+			this.$http
+				.get({
+					url: this.$api.getClassroomPosterInfo
+				})
+				.then((res: any) => {
+					this.info = res;
+				}, (err: any) => {
+					console.log(err);
+				});
+		}
+		
+		getCategoryList() {
+			this.calssList = [];
+			// uni.showLoading({
+			// 	title: '加载中',
+			// });
+			return this.$http
+				.get({
+					url: this.$api.getClassroomSortList
+				})
+				.then((res : any) => {
+					console.log(res);
+					this.calssList = res;
+					this.sortId = this.calssList[0].id || null;
+					this.list = [];
+					this.sortId && this.getList(this.sortId);
+					// uni.hideLoading();
+				}, (err : any) => {
+					console.log(err);
+					// uni.hideLoading();
+				});
+		}
+		
+		changeTab(id : any) {
+			this.sortId = id;
+			this.list = [];
+			this.current = 1;
+			this.finish = false;
+			this.sortId && this.getList(this.sortId);
+		}
+		
+		getList(sortId: any){
+			this.loading = true;
+			// uni.showLoading({
+			// 	title: '加载中',
+			// });
+			return this.$http
+				.get({
+					url: this.$api.getClassroomArticleList,
+					data: {
+						sortId,
+						size: this.size,
+						page: this.current,
+						status: '3'
+					}
+				})
+				.then((res : any) => {
+					this.list = [...this.list, ...res.list];
+					this.loading = false;
+					if (res.list.length < this.size) {
+						this.finish = true;
+					}
+					// uni.hideLoading();
+					return res.list;
+				}, (err : any) => {
+					console.log(err);
+					this.loading = false;
+					// uni.hideLoading();
+				});
+		}
+		
+		toDetail(id: any){
+			this.$Router.push({
+				path: "/packages/classroom/classroom-detail",
+				query: {
+					id
+				}
+			})
+		}
+	}
+</script>
+
+<style lang='scss' scoped>
+	.classroom-box {
+		min-height: 100%;
+		@include flex-y();
+		background: #F6F6F6;
+
+		.container {
+			flex: 1;
+			width: 100%;
+			box-sizing: border-box;
+			overflow-y: auto;
+
+			.pic {
+				width: 100%;
+				height: vw(140);
+				display: block;
+			}
+			.pic-box2{
+				height: vw(72);
+				background: #fff;
+				@include flex-x(center);
+			}
+			.pic2{
+				width: vw(108);
+				/* height: vw(74); */
+				display: block;
+			}
+			
+			.tab-box {
+				width: 100%;
+				box-sizing: border-box;
+				@include flex-x();
+				position: relative;
+				z-index: 5;
+				padding: 0 vw(5);
+				box-sizing: border-box;
+				// border-top: vw(0.5) solid #F5F5F7;
+				background: #fff;
+				margin-bottom: vw(1);
+				box-shadow: 0px 1px 4px 0px rgba(0, 0, 0, 0.05);
+				border-bottom-left-radius: vw(10);
+				border-bottom-right-radius: vw(10);
+				border-top: vw(1) solid #F6F6F6;
+			
+				.tabs {
+					height: 46px;
+					white-space: nowrap;
+					padding: 0 vw(6);
+					box-sizing: border-box;
+			
+					.tab {
+						padding: 0 vw(15);
+						@include word-vw(14, #999);
+						height: 26px;
+						line-height: 26px;
+						white-space: nowrap;
+						display: inline-block;
+						position: relative;
+						margin-top: vw(10);
+						border-radius: vw(13);
+			
+						&.active {
+							color: #fff;
+							/* font-weight: 600; */
+							background: $btn-color;
+			
+							/* .bar {
+								position: absolute;
+								width: vw(16);
+								height: vw(3);
+								border-radius: vw(2);
+								background: #F08304;
+								left: 50%;
+								transform: translateX(-50%);
+								bottom: vw(0);
+							} */
+						}
+					}
+				}
+			}
+			
+			.goods{
+				padding: 0 vw(5);
+				box-sizing: border-box;
+				@include flex-x();
+				flex-wrap: wrap;
+				.item{
+					width: vw(180);
+					margin-top: vw(10);
+					.pic{
+						width: 100%;
+						height: vw(100);
+					}
+					.name{
+						width: 100%;
+						height: vw(40);
+						@include flex-x(center);
+						background: #fff;
+					}
+				}
+			}
+		}
+
+		.data-tips {
+			width: 100%;
+			text-align: center;
+			@include word-vw(12, $gray9);
+			margin-top: 10px;
+			margin-bottom: vw(10);
+		}
+	}
+</style>

+ 253 - 0
src/packages/goods/category.vue

@@ -0,0 +1,253 @@
+<template>
+	<view class="category-box">
+		<Navbar title="全部分类" :showBack="false" background-color="transparent" color="#333"></Navbar>
+		<view class="container">
+			<view class="top-search" @click="toPage('/packages/goods/search')">
+				<IconText :code="`\ue841`" color="#C4C4C4" size="14" style="margin-right: 5px;"></IconText>
+				请输入商品名称进行搜索
+			</view>
+			<view class="bottom-category">
+				<view class="left">
+					<view class="item" @click="handleFirst(item)" :class="{active: firstActive === item.id}"
+						v-for="item in categoryList" :key="item.id">
+						<view class="bar" v-if="firstActive === item.id"></view>
+						{{item.name}}
+					</view>
+				</view>
+				<view class="right">
+					<view class="first-name">
+						{{nameMap[firstActive] || ''}}
+					</view>
+					<view class="second-box">
+						<view class="item" v-for="item in secondList" :key="item.id" @click="toSearch(item)">
+							<image class="img" :src="item.pic" mode="aspectFill"></image>
+							<text>{{item.name}}</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- <TabBar></TabBar> -->
+	</view>
+</template>
+
+<script lang="ts">
+	import {
+		Component,
+		Prop,
+		Vue,
+		Mixins
+	} from 'vue-property-decorator';
+	import {
+		namespace
+	} from 'vuex-class';
+	import {
+		types
+	} from '@/common/store/index';
+	const baseModule = namespace('base');
+	import loginMixin from '@/common/mixins/loginMixin.ts';
+	@Component({})
+	export default class Category extends Mixins(loginMixin) {
+		@baseModule.Mutation(types.SET_TABBARINDEX) setTabBarIndex: any;
+		categoryList: any = [];
+		firstActive: any = null;
+		categoryObj: any = {};
+		secondList: any = [];
+		nameMap: any = {};
+		staticUrl: string = this.$oss_url; //oss地址
+		shareInfo: any = {};
+		async onShow() {
+			this.$nextTick(function() {
+				uni.hideTabBar();
+			});
+			this.setTabBarIndex(1);
+			this.getShareInfo();
+			await this.getCategoryList();
+			if (uni.getStorageSync('categoryId')) {
+				this.handleFirst({
+					id: +uni.getStorageSync('categoryId')
+				});
+				uni.setStorageSync('categoryId', '');
+			}
+		}
+		onShareAppMessage() {
+			return {
+				title: '花源溪',
+				path: '/pages/front/front?s=1&uid=' + this._userInfo.uid,
+				imageUrl: this.shareInfo.pic
+			};
+		}
+		//获取商品分类
+		getCategoryList() {
+			// uni.showLoading({
+			// 	title: '加载中',
+			// });
+			return this.$http
+				.get({
+					url: this.$api.getCategoryList
+				})
+				.then((res: any) => {
+					// this.categoryList = [...res.list, ...res.list];
+					this.categoryList = res.list;
+					// this.categoryList.unshift({
+					// 	id: 0,
+					// 	name: '全部商品',
+					// 	second: [{
+					// 		id: 0,
+					// 		name: '全部商品',
+					// 		pic: this.staticUrl ? this.staticUrl + 'all-goods.png' : ''
+					// 	}]
+					// });
+					let obj: any = {},
+						nameMap: any = {};
+					res.list.forEach((item: any) => {
+						obj[item.id] = item.second;
+						nameMap[item.id] = item.name;
+					})
+					this.nameMap = nameMap;
+					this.categoryObj = obj;
+					this.handleFirst(res.list[0]);
+					// uni.hideLoading();
+				}, (err: any) => {
+					console.log(err);
+					// uni.hideLoading();
+				});
+		}
+		getShareInfo() {
+			this.$http
+				.get({
+					url: this.$api.getShareInfo
+				})
+				.then((res: any) => {
+					this.shareInfo = res.info;
+				}, (err: any) => {
+					console.log(err);
+				});
+		}
+		handleFirst(item: any) {
+			this.firstActive = item.id;
+			this.secondList = this.categoryObj[item.id];
+		}
+		toSearch(item: any) {
+			uni.setStorageSync('categoryId', item.fid);
+			this.$Router.push({
+				path: '/packages/goods/search',
+				query: {
+					name: item.name,
+					id: item.id
+				}
+			})
+		}
+		toPage(path: any) {
+			this.$Router.push({
+				path: path
+			})
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.category-box {
+		height: 100vh;
+		background: #fff;
+		@include flex-y();
+
+		.container {
+			width: 100%;
+			@include flex-y();
+			flex: 1;
+			// padding-bottom: vw(64);
+			box-sizing: border-box;
+			overflow: hidden;
+
+			.top-search {
+				width: vw(335);
+				height: vw(32);
+				background: #F6F6F6;
+				border-radius: vw(16);
+				@include flex-x(flex-start);
+				@include word-vw(14, #999);
+				padding: 0 vw(12);
+				box-sizing: border-box;
+				margin-top: vw(3);
+			}
+
+			.bottom-category {
+				flex: 1;
+				width: 100%;
+				@include flex-x(flex-start);
+				padding-top: vw(20);
+				box-sizing: border-box;
+				overflow: hidden;
+
+				.left {
+					width: vw(88);
+					height: 100%;
+					overflow-y: auto;
+					flex-shrink: 0;
+					background: #F6F6F6;
+
+					/deep/ ::-webkit-scrollbar {
+						/* 隐藏滚动条,但依旧具备可以滚动的功能 */
+						display: none
+					}
+
+					.item {
+						background: #F6F6F6;
+						height: vw(50);
+						width: 100%;
+						@include flex-x(center);
+						@include word-vw(13, #333);
+						position: relative;
+
+						&.active {
+							background: #fff;
+							color: $btn-color;
+						}
+
+						.bar {
+							width: vw(4);
+							height: vw(24);
+							background: $btn-color;
+							position: absolute;
+							left: 0;
+						}
+					}
+				}
+
+				.right {
+					flex: 1;
+					height: 100%;
+					padding: 0 vw(15);
+					overflow-y: auto;
+					box-sizing: border-box;
+
+					.first-name {
+						height: vw(36);
+						line-height: vw(36);
+						@include word-vw(14, #333);
+					}
+
+					.second-box {
+						@include flex-x(flex-start);
+						margin-top: vw(12);
+						flex-wrap: wrap;
+
+						.item {
+							@include flex-y();
+							@include word-vw(12, #333);
+							width: 1/3 * 100%;
+							margin-bottom: vw(10);
+
+							.img {
+								width: vw(72);
+								height: vw(72);
+								margin-bottom: vw(10);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

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